Qual é a maneira portátil de anotar uma propriedade byte[]?
Depende do que você quer. JPA pode persistir um
byte[]
não anotado . Da especificação JPA 2.0:11.1.6 Anotação básica
OBasic
anotação é o tipo mais simples de mapeamento para uma coluna de banco de dados. OBasic
A anotação pode ser aplicada a uma propriedade persistente ou variável de instância de qualquer um dos seguintes tipos:Java primitivo, tipos, wrappers dos tipos primitivos,java.lang.String
,java.math.BigInteger
,java.math.BigDecimal
,java.util.Date
,java.util.Calendar
,java.sql.Date
,java.sql.Time
,java.sql.Timestamp
,byte[]
,Byte[]
,char[]
,Character[]
, enums e qualquer outro tipo que implementeSerializable
.Conforme descrito na Seção 2.8, o uso doBasic
A anotação é opcional para campos e propriedades persistentes desses tipos. Se a anotação Básica não for especificada para tal campo ou propriedade, os valores padrão da anotação Básica serão aplicados.
E o Hibernate irá mapeá-lo "por padrão" para um SQL
VARBINARY
(ou um SQL LONGVARBINARY
dependendo da Column
size?) que o PostgreSQL trata com um bytea
. Mas se você quiser o
byte[]
para ser armazenado em um objeto grande, você deve usar um @Lob
. Da especificação:11.1.24 Anotação de Lob
UmLob
anotação especifica que uma propriedade ou campo persistente deve ser persistente como um objeto grande para um tipo de objeto grande suportado por banco de dados.Aplicativos portáteis devem usar oLob
anotação ao mapear para um banco de dadosLob
tipo. OLob
A anotação pode ser usada em conjunto com a anotação Básica ou com aElementCollection
anotação quando o valor da coleção do elemento for do tipo básico. UmLob
pode ser um tipo binário ou de caractere. OLob
o tipo é inferido do tipo do campo ou propriedade persistente e, exceto para os tipos de string e caractere, o padrão é Blob.
E o Hibernate irá mapeá-lo para um SQL
BLOB
que o PostgreSQL trata com um oid
.
Isso é corrigido em alguma versão recente do hibernate?
Bem, o problema é que eu não sei qual é o problema exatamente. Mas posso pelo menos dizer que nada mudou desde o 3.5.0-Beta-2 (que é onde uma mudança foi introduzida) na ramificação 3.5.x.
Mas meu entendimento de problemas como HHH-4876, HHH-4617 e de PostgreSQL e BLOBs (mencionados no javadoc do
PostgreSQLDialect
) é que você deve definir a seguinte propriedade hibernate.jdbc.use_streams_for_binary=false
se você quiser usar
oid
ou seja, byte[]
com @Lob
(que é o meu entendimento desde VARBINARY
não é o que você quer com o Oracle). Você tentou isso? Como alternativa, o HHH-4876 sugere o uso do
PrimitiveByteArrayBlobType
obsoleto para obter o comportamento antigo (pré Hibernate 3.5). Referências
- Especificação JPA 2.0
- Seção 2.8 "Padrões de mapeamento para campos ou propriedades que não são de relacionamento"
- Seção 11.1.6 "Anotação básica"
- Seção 11.1.24 "Anotação de Lob"
Recursos
- http://opensource.atlassian.com/projects/hibernate/browse/HHH-4876
- http://opensource.atlassian.com/projects/hibernate/browse/HHH-4617
- http://relation.to/Bloggers/PostgreSQLAndBLOBs