Wat is de draagbare manier om een byte[]-eigenschap te annoteren?
Het hangt af van wat je wilt. JPA kan een niet-geannoteerde byte[]
persist . Van de JPA 2.0-specificatie:
11.1.6 Basisannotatie
De Basic
annotatie is het eenvoudigste type toewijzing aan een databasekolom. De Basic
annotatie kan worden toegepast op een persistente eigenschap of instantievariabele van elk van de volgende typen:Java-primitief, typen, wrappers van de primitieve 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[]
, opsommingen en elk ander type dat Serializable
. implementeert .Zoals beschreven in Paragraaf 2.8, is het gebruik van de Basic
annotatie is optioneel voor persistente velden en eigenschappen van deze typen. Als de basisannotatie niet is gespecificeerd voor een dergelijk veld of eigenschap, zijn de standaardwaarden van de basisannotatie van toepassing.
En Hibernate wijst een it "standaard" toe aan een SQL VARBINARY
(of een SQL LONGVARBINARY
afhankelijk van de Column
grootte?) die PostgreSQL verwerkt met een bytea
.
Maar als je de byte[]
. wilt om te worden opgeslagen in een groot object, moet u een @Lob
. gebruiken . Uit de specificaties:
11.1.24 Lob-annotatie
Een Lob
annotatie geeft aan dat een apersistente eigenschap of veld moet worden aangehouden als een groot object voor een door een database ondersteund groot objecttype. Draagbare toepassingen moeten deLob
gebruiken annotatie bij toewijzing aan een database Lob
type. De Lob
annotatie kan worden gebruikt in combinatie met de basisannotatie of met deElementCollection
annotatie wanneer de waarde van de elementverzameling van het basistype is. Een Lob
kan ofwel een binair karaktertype zijn. De Lob
type wordt afgeleid van het type van het persistente veld of de eigenschap en, met uitzondering van tekenreeksen en tekentypen, wordt standaard ingesteld op Blob.
En Hibernate zal het toewijzen aan een SQL BLOB
die PostgreSQL afhandelt met een oid
.
Is dit opgelost in een recente versie van hibernate?
Het probleem is dat ik niet precies weet wat het probleem is. Maar ik kan in ieder geval zeggen dat er niets is veranderd sinds 3.5.0-Beta-2 (waar een wijziging is geïntroduceerd) in de 3.5.x-tak.
Maar mijn begrip van zaken als HHH-4876, HHH-4617 en van PostgreSQL en BLOB's (vermeld in de javadoc van het PostgreSQLDialect
) is dat u de volgende eigenschap moet instellen
hibernate.jdbc.use_streams_for_binary=false
als je oid
. wilt gebruiken d.w.z. byte[]
met @Lob
(wat ik begrijp sinds VARBINARY
is niet wat je wilt met Oracle). Heb je dit geprobeerd?
Als alternatief stelt HHH-4876 voor om het verouderde PrimitiveByteArrayBlobType
te gebruiken om het oude gedrag te krijgen (pre Hibernate 3.5).
Referenties
- JPA 2.0-specificatie
- Sectie 2.8 "Standaardwaarden toewijzen voor niet-relatievelden of eigenschappen"
- Sectie 11.1.6 "Basisannotatie"
- Sectie 11.1.24 "Lob-annotatie"
Bronnen
- http://opensource.atlassian.com/projects/hibernate/browse/HHH-4876
- http://opensource.atlassian.com/projects/hibernate/browse/HHH-4617
- http://relation.to/Bloggers/PostgreSQLAndBLOBs