PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

anotação de hibernação adequada para byte[]


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


O Basic anotação é o tipo mais simples de mapeamento para uma coluna de banco de dados. O Basic 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 implemente Serializable .Conforme descrito na Seção 2.8, o uso do Basic 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


Um Lob 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 o Lob anotação ao mapear para um banco de dados Lob tipo. O Lob A anotação pode ser usada em conjunto com a anotação Básica ou com a ElementCollection anotação quando o valor da coleção do elemento for do tipo básico. Um Lob pode ser um tipo binário ou de caractere. O Lob 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