Какъв е преносимият начин за анотиране на свойство byte[]?
Зависи какво искаш. JPA може да запази неанотиран byte[]
. От спецификацията на JPA 2.0:
11.1.6 Основна анотация
Basic
анотацията е най-простият тип на съпоставяне с колона на база данни.Basic
анотацията може да се приложи към постоянно свойство или променлива на екземпляра на някой от следните типове:примитив на Java, типове, обвивки на примитивните типове,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 и всеки друг тип, който имплементираSerializable
.Както е описано в раздел 2.8, използването наBasic
анотацията не е задължителна за постоянни полета и свойства от тези типове. Ако основната анотация не е посочена за такова поле или свойство, ще се прилагат стойностите по подразбиране на основната анотация.
И Hibernate ще съпостави a it "по подразбиране" към SQL VARBINARY
(или SQL LONGVARBINARY
в зависимост от Column
размер?), които PostgreSQL обработва с bytea
.
Но ако искате byte[]
за да се съхранява в голям обект, трябва да използвате @Lob
. От спецификацията:
11.1.24 Lob анотация
A
Lob
анотацията указва, че свойството или полето apersistent трябва да бъде запазено като голям обект за тип голям обект, поддържан от база данни. Преносимите приложения трябва да използватLob
анотация при съпоставяне с база данниLob
Тип.Lob
анотацията може да се използва във връзка с основната анотация или сElementCollection
анотация, когато стойността на колекцията на елементите е от основен тип. ALob
може да бъде или бинарен или тип символ.Lob
Типът се извежда от типа на постоянното поле или свойство и, с изключение на типовете низове и знаци, по подразбиране е Blob.
И Hibernate ще го съпостави с SQL BLOB
които PostgreSQL обработва с oid
.
Това коригирано ли е в някоя последна версия на хибернация?
Е, проблемът е, че не знам какъв точно е проблема. Но мога поне да кажа, че нищо не се е променило от 3.5.0-Beta-2 (което е мястото, където е въведена промяна) в клона 3.5.x.
Но моето разбиране за проблеми като HHH-4876, HHH-4617 и за PostgreSQL и BLOB (споменати в javadoc на PostgreSQLDialect
) е, че трябва да зададете следното свойство
hibernate.jdbc.use_streams_for_binary=false
ако искате да използвате oid
т.е. byte[]
с @Lob
(което е моето разбиране от VARBINARY
не е това, което искате с Oracle). Опитахте ли това?
Като алтернатива HHH-4876 предлага използването на отхвърления PrimitiveByteArrayBlobType
за да получите старото поведение (преди Hibernate 3.5).
Препратки
- Спецификация на JPA 2.0
- Раздел 2.8 „По подразбиране на картографиране за полета или свойства, които не са свързани“
- Раздел 11.1.6 „Основна анотация“
- Раздел 11.1.24 „Анотация на дялове“
Ресурси
- http://opensource.atlassian.com/projects/hibernate/browse/HHH-4876
- http://opensource.atlassian.com/projects/hibernate/browse/HHH-4617
- http://relation.to/Bloggers/PostgreSQLAndBLOBs