Vad är det bärbara sättet att kommentera en byte[]-egenskap?
Det beror på vad du vill. JPA kan bestå en icke kommenterad byte[]
. Från JPA 2.0-specifikationen:
11.1.6 Grundläggande anteckning
Basic
annotering är den enklaste typen av mappning till en databaskolumn.Basic
annotering kan appliceras på en beständig egenskap eller instansvariabel av någon av följande typer:Java primitive, types, wrappers of the primitive types,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 och alla andra typer som implementerarSerializable
.Som beskrivs i avsnitt 2.8, användningen avBasic
annotering är valfritt för beständiga fält och egenskaper av dessa typer. Om Basicannotation inte är specificerad för sådan afield eller egenskap kommer standardvärdena för Basic annotation att gälla.
Och Hibernate mappar det "som standard" till en SQL VARBINARY
(eller en SQL LONGVARBINARY
beroende på Column
storlek?) som PostgreSQL hanterar med en bytea
.
Men om du vill ha byte[]
för att lagras i ett stort objekt bör du använda en @Lob
. Från specifikationen:
11.1.24 Lobbanteckning
En
Lob
annotering anger att en apersistent egenskap eller ett fält ska bestå som ett stort objekt till en databasstödd stor objekttyp. Bärbara applikationer bör användaLob
anteckning vid mappning till en databasLob
typ.Lob
annotering kan användas tillsammans med den grundläggande annoteringen eller medElementCollection
anteckning när elementsamlingsvärdet är av bastyp. EnLob
kan antingen vara en binär eller teckentyp.Lob
typ härleds från typen av det beständiga fältet eller egenskapen och, förutom sträng- och teckentyper, är standardinställningen Blob.
Och Hibernate mappar den till en SQL BLOB
som PostgreSQL hanterar med en oid
.
Är detta åtgärdat i någon ny version av viloläge?
Tja, problemet är att jag inte vet exakt vad problemet är. Men jag kan åtminstone säga att ingenting har förändrats sedan 3.5.0-Beta-2 (vilket är där en förändring har införts) i 3.5.x-grenen.
Men min förståelse för problem som HHH-4876, HHH-4617 och PostgreSQL och BLOBs (nämns i javadoc av PostgreSQLDialect
) är att du ska ställa in följande egenskap
hibernate.jdbc.use_streams_for_binary=false
om du vill använda oid
dvs byte[]
med @Lob
(vilket är min uppfattning sedan VARBINARY
är inte vad du vill med Oracle). Testade du detta?
Som ett alternativ föreslår HHH-4876 att du använder den föråldrade PrimitiveByteArrayBlobType
för att få det gamla beteendet (pre Hibernate 3.5).
Referenser
- JPA 2.0-specifikation
- Avsnitt 2.8 "Mappning av standardinställningar för icke-relationsfält eller egenskaper"
- Avsnitt 11.1.6 "Grundläggande anteckning"
- Avsnitt 11.1.24 "Lobbanteckning"
Resurser
- http://opensource.atlassian.com/projects/hibernate/browse/HHH-4876
- http://opensource.atlassian.com/projects/hibernate/browse/HHH-4617
- http://relation.to/Bloggers/PostgreSQLAndBLOBs