Jaki jest przenośny sposób dodawania adnotacji do właściwości byte[]?
To zależy od tego, czego chcesz. JPA może utrwalać nieopisany byte[]
. Ze specyfikacji JPA 2.0:
11.1.6 Podstawowa adnotacja
Basic
adnotacja jest najprostszym typem mapowania do kolumny bazy danych. Basic
Adnotację można zastosować do trwałej właściwości lub zmiennej instancji dowolnego z następujących typów:prymityw Java, typy, opakowania typów pierwotnych,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[]
, wyliczenia i każdy inny typ, który implementuje Serializable
.Jak opisano w Sekcji 2.8, użycie Basic
adnotacja jest opcjonalna dla trwałych pól i właściwości tych typów. Jeśli adnotacja podstawowa nie jest określona dla takiego pola lub właściwości, zostaną zastosowane domyślne wartości adnotacji podstawowej.
Hibernate zmapuje go "domyślnie" na VARBINARY
SQL (lub SQL LONGVARBINARY
w zależności od Column
size?), które PostgreSQL obsługuje za pomocą bytea
.
Ale jeśli chcesz byte[]
aby był przechowywany w dużym obiekcie, powinieneś użyć @Lob
. Ze specyfikacji:
11.1.24 Adnotacja do lobby
Lob
adnotacja określa, że trwała właściwość lub pole powinny być utrwalane jako duży obiekt dla typu dużego obiektu obsługiwanego przez bazę danych. Aplikacje przenośne powinny używać Lob
adnotacja podczas mapowania do bazy danych Lob
rodzaj. Lob
adnotacja może być używana w połączeniu z adnotacją theBasic lub z ElementCollection
adnotacja, gdy wartość kolekcji elementu jest typu podstawowego. Lob
może być binarnym typem orcharakteru. Lob
typ jest wywnioskowany z typu trwałego pola lub właściwości i, z wyjątkiem typów ciągów i znaków, domyślnie jest to Blob.
Hibernate zmapuje go do BLOB
SQL które PostgreSQL obsługuje za pomocą oid
.
Czy zostało to naprawione w jakiejś najnowszej wersji hibernacji?
Cóż, problem polega na tym, że nie wiem, na czym dokładnie polega problem. Ale mogę przynajmniej powiedzieć, że nic się nie zmieniło od 3.5.0-Beta-2 (czyli tam, gdzie wprowadzono zmianę) w gałęzi 3.5.x.
Ale moje zrozumienie problemów takich jak HHH-4876, HHH-4617 oraz PostgreSQL i BLOB (wspomnianych w javadoc PostgreSQLDialect
) jest to, że powinieneś ustawić następującą właściwość
hibernate.jdbc.use_streams_for_binary=false
jeśli chcesz użyć oid
tj. byte[]
z @Lob
(co rozumiem od czasu VARBINARY
nie jest tym, czego chcesz od Oracle). Czy próbowałeś tego?
Jako alternatywę HHH-4876 sugeruje użycie przestarzałego PrimitiveByteArrayBlobType
aby uzyskać stare zachowanie (przed Hibernate 3.5).
Referencje
- Specyfikacja JPA 2.0
- Sekcja 2.8 „Domyślne mapowanie pól lub właściwości niezwiązanych z relacjami”
- Sekcja 11.1.6 „Podstawowa adnotacja”
- Sekcja 11.1.24 „Adnotacja w lobby”
Zasoby
- http://opensource.atlassian.com/projects/hibernate/browse/HHH-4876
- http://opensource.atlassian.com/projects/hibernate/browse/HHH-4617
- http://relation.to/Bloggers/PostgreSQLAndBLOBs