Jaký je přenosný způsob, jak anotovat vlastnost byte[]?
Záleží na tom, co chcete. JPA může uchovat byte[]
bez poznámek . Ze specifikace JPA 2.0:
11.1.6 Základní anotace
Basic
anotace je nejjednodušší typ mapování na sloupec databáze.Basic
anotace může být aplikována na trvalou vlastnost nebo proměnnou instance libovolného z následujících typů:primitivní Java, typy, obaly primitivních typů,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[]
, enums a jakýkoli jiný typ, který implementujeSerializable
.Jak je popsáno v části 2.8, použitíBasic
anotace je volitelná pro trvalá pole a vlastnosti těchto typů. Pokud není pro takové pole nebo vlastnost uvedena základní anotace, použijí se výchozí hodnoty základní anotace.
A Hibernate namapuje it "ve výchozím nastavení" na SQL VARBINARY
(nebo SQL LONGVARBINARY
v závislosti na Column
velikost?), kterou PostgreSQL zpracovává pomocí bytea
.
Ale pokud chcete byte[]
pro uložení do velkého objektu byste měli použít @Lob
. Ze specifikace:
11.1.24 Anotace Lob
Lob
anotace určuje, že trvalá vlastnost nebo pole by měly být zachovány jako velký objekt typu velkého objektu podporovaného databází. Přenosné aplikace by měly používatLob
anotace při mapování do databázeLob
typ.Lob
anotace může být použita ve spojení s anotací Basic nebo sElementCollection
anotace, když je hodnota kolekce prvků základního typu.Lob
může být buď binární nebo typ znaku.Lob
typ je odvozen z typu trvalého pole nebo vlastnosti a kromě typů řetězců a znaků je výchozí Blob.
A Hibernate jej namapuje na SQL BLOB
které PostgreSQL zpracovává pomocí oid
.
Je to opraveno v některé nejnovější verzi hibernace?
No, problém je v tom, že přesně nevím, v čem je problém. Ale mohu alespoň říci, že se nic nezměnilo od 3.5.0-Beta-2 (což je místo, kde byla zavedena změna) ve větvi 3.5.x.
Ale moje chápání problémů jako HHH-4876, HHH-4617 a PostgreSQL a BLOB (zmíněno v javadocu PostgreSQLDialect
) je, že byste měli nastavit následující vlastnost
hibernate.jdbc.use_streams_for_binary=false
pokud chcete použít oid
tj. byte[]
s @Lob
(což chápu od VARBINARY
není to, co chcete s Oracle). Zkusili jste to?
Jako alternativu HHH-4876 navrhuje použít zastaralý PrimitiveByteArrayBlobType
získat staré chování (před Hibernate 3.5).
Odkazy
- Specifikace JPA 2.0
- Část 2.8 „Mapování výchozích hodnot pro nerelační pole nebo vlastnosti“
- Oddíl 11.1.6 „Základní anotace“
- Oddíl 11.1.24 „Anotace lobu“
Zdroje
- http://opensource.atlassian.com/projects/hibernate/browse/HHH-4876
- http://opensource.atlassian.com/projects/hibernate/browse/HHH-4617
- http://relation.to/Bloggers/PostgreSQLAndBLOBs