PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

annotazione di ibernazione corretta per byte[]

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