PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

richtige Hibernate-Anmerkung für byte[]

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