Qual è il modo portatile per annotare una proprietà byte[]?
Dipende da cosa vuoi. JPA può persistere un byte[]
non annotato . Dalle specifiche JPA 2.0:
11.1.6 Annotazione di base
Il Basic
l'annotazione è il tipo più semplice di mappatura su una colonna del database. Il Basic
l'annotazione può essere applicata a una proprietà persistente o a una variabile di istanza di uno qualsiasi dei seguenti tipi:primitiva Java, tipi, wrapper dei tipi primitivi, 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[]
, enum e qualsiasi altro tipo che implementa Serializable
.Come descritto nella Sezione 2.8, l'uso del Basic
l'annotazione è facoltativa per i campi persistenti e le proprietà di questi tipi. Se l'annotazione di base non è specificata per tale campo o proprietà, verranno applicati i valori predefiniti dell'annotazione di base.
E Hibernate mapperà un it "per impostazione predefinita" su un VARBINARY
SQL (o un LONGVARBINARY
SQL a seconda della Column
size?) che PostgreSQL gestisce con un bytea
.
Ma se vuoi il byte[]
per essere archiviato in un oggetto grande, dovresti usare un @Lob
. Dalle specifiche:
11.1.24 Annotazione Lob
Un Lob
l'annotazione specifica che la proprietà o il campo persistenti devono essere mantenuti come un oggetto di grandi dimensioni in un tipo di oggetto di grandi dimensioni supportato dal database. Le applicazioni portatili dovrebbero utilizzare il Lob
annotazione durante la mappatura su un database Lob
genere. Il Lob
annotationpuò essere utilizzato insieme all'annotazione di base o con ElementCollection
annotazione quando il valore della raccolta dell'elemento è di tipo basic. Un Lob
può essere un tipo binario o carattere. Il Lob
il tipo è dedotto dal tipo del campo o della proprietà persistente e, ad eccezione dei tipi di stringa e di carattere, il valore predefinito è Blob.
E Hibernate lo mapperà su un BLOB
SQL che PostgreSQL gestisce con un oid
.
È stato risolto in qualche versione recente di ibernazione?
Bene, il problema è che non so quale sia esattamente il problema. Ma posso almeno dire che nulla è cambiato dalla 3.5.0-Beta-2 (che è dove è stata introdotta una modifica) nel ramo 3.5.x.
Ma la mia comprensione di problemi come HHH-4876, HHH-4617 e di PostgreSQL e BLOB (menzionati nel javadoc del PostgreSQLDialect
) è che dovresti impostare la seguente proprietà
hibernate.jdbc.use_streams_for_binary=false
se vuoi usare oid
cioè byte[]
con @Lob
(che è la mia comprensione da VARBINARY
non è quello che vuoi con Oracle). Hai provato questo?
In alternativa, HHH-4876 suggerisce di utilizzare il deprecato PrimitiveByteArrayBlobType
per ottenere il vecchio comportamento (pre Hibernate 3.5).
Riferimenti
- Specifica JPA 2.0
- Sezione 2.8 "Mappatura dei valori predefiniti per campi o proprietà non relazionali"
- Sezione 11.1.6 "Annotazioni di base"
- Sezione 11.1.24 "Annotazione Lob"
Risorse
- http://opensource.atlassian.com/projects/hibernate/browse/HHH-4876
- http://opensource.atlassian.com/projects/hibernate/browse/HHH-4617
- http://relation.to/Bloggers/PostgreSQLAndBLOBs