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
Basicannotering är den enklaste typen av mappning till en databaskolumn.Basicannotering 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 avBasicannotering ä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
Lobannotering 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ändaLobanteckning vid mappning till en databasLobtyp.Lobannotering kan användas tillsammans med den grundläggande annoteringen eller medElementCollectionanteckning när elementsamlingsvärdet är av bastyp. EnLobkan antingen vara en binär eller teckentyp.Lobtyp 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
- https://opensource.atlassian.com/projects/hibernate/browse/HHH-4876
- https://opensource.atlassian.com/projects/hibernate/browse/HHH-4617
- https://relation.to/Bloggers/PostgreSQLAndBLOBs