Какъв е преносимият начин за анотиране на свойство 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 „Анотация на дялове“
Ресурси
- https://opensource.atlassian.com/projects/hibernate/browse/HHH-4876
- https://opensource.atlassian.com/projects/hibernate/browse/HHH-4617
- https://relation.to/Bloggers/PostgreSQLAndBLOBs