Was ist der portable Weg, um eine byte[]-Eigenschaft zu kommentieren?
Es hängt davon ab, was Sie wollen. JPA kann ein nicht annotiertes byte[]
beibehalten . Aus der JPA 2.0-Spezifikation:
11.1.6 Grundlegende Anmerkung
Der Basic
Annotation ist die einfachste Art der Zuordnung zu einer Datenbankspalte. Die Basic
Annotation kann auf eine persistente Eigenschaft oder Instanzvariable eines der folgenden Typen angewendet werden:Java-Primitive, Typen, Wrapper der primitiven Typen, 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[]
, Aufzählungen und alle anderen Typen, die Serializable
implementieren .Wie in Abschnitt 2.8 beschrieben, ist die Verwendung des Basic
Anmerkungen sind für persistente Felder und Eigenschaften dieser Typen optional. Wenn die Basic-Annotation für ein solches Feld oder eine solche Eigenschaft nicht angegeben ist, gelten die Standardwerte der Basic-Annotation.
Und Hibernate ordnet es "standardmäßig" einem SQL VARBINARY
zu (oder ein SQL LONGVARBINARY
abhängig von der Column
size?), die PostgreSQL mit einem bytea
behandelt .
Aber wenn Sie das byte[]
wollen um in einem großen Objekt gespeichert zu werden, sollten Sie einen @Lob
verwenden . Aus der Spezifikation:
11.1.24 Lob-Anmerkung
Ein Lob
Die Anmerkung gibt an, dass eine dauerhafte Eigenschaft oder ein Feld als großes Objekt für einen datenbankunterstützten großen Objekttyp beibehalten werden soll. Tragbare Anwendungen sollten den Lob
verwenden Anmerkung beim Zuordnen zu einer Datenbank Lob
Typ. Der Lob
Annotation kann in Verbindung mit der Basic-Annotation oder mit der ElementCollection
verwendet werden Anmerkung, wenn der Wert der Elementsammlung vom Basistyp ist. Ein Lob
kann entweder ein binärer oder ein Zeichentyp sein. Der Lob
Der Typ wird vom Typ des persistenten Felds oder der Eigenschaft abgeleitet und ist mit Ausnahme von Zeichenfolgen- und Zeichentypen standardmäßig Blob.
Und Hibernate wird es einem SQL BLOB
zuordnen die PostgreSQL mit einem oid
verarbeitet .
Wurde dies in einer neueren Version von Hibernate behoben?
Nun, das Problem ist, dass ich nicht weiß, was genau das Problem ist. Aber ich kann zumindest sagen, dass sich seit 3.5.0-Beta-2 (wo eine Änderung eingeführt wurde) im 3.5.x-Zweig nichts geändert hat.
Aber mein Verständnis von Problemen wie HHH-4876, HHH-4617 und von PostgreSQL und BLOBs (erwähnt im Javadoc des PostgreSQLDialect
) ist, dass Sie die folgende Eigenschaft setzen sollen
hibernate.jdbc.use_streams_for_binary=false
wenn Sie oid
verwenden möchten also byte[]
mit @Lob
(was ich seit VARBINARY
verstehe ist bei Oracle nicht das, was Sie wollen). Hast du das versucht?
Als Alternative schlägt HHH-4876 vor, den veralteten PrimitiveByteArrayBlobType
zu verwenden um das alte Verhalten zu erhalten (vor Hibernate 3.5).
Referenzen
- JPA 2.0-Spezifikation
- Abschnitt 2.8 „Zuordnungsvorgaben für Nicht-Beziehungsfelder oder Eigenschaften“
- Abschnitt 11.1.6 „Grundlegende Anmerkung“
- Abschnitt 11.1.24 „Lob-Anmerkung“
Ressourcen
- http://opensource.atlassian.com/projects/hibernate/browse/HHH-4876
- http://opensource.atlassian.com/projects/hibernate/browse/HHH-4617
- http://relation.to/Bloggers/PostgreSQLAndBLOBs