sql >> Databasteknik >  >> RDS >> PostgreSQL

korrekt vilolägeskommentar för byte[]

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 implementerar Serializable .Som beskrivs i avsnitt 2.8, användningen av Basic 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ända Lob anteckning vid mappning till en databas Lob typ. Lob annotering kan användas tillsammans med den grundläggande annoteringen eller med ElementCollection anteckning när elementsamlingsvärdet är av bastyp. En Lob 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


  1. Hantera hög tillgänglighet i PostgreSQL – Del II:Replikeringshanterare

  2. Kontrollera om RPC Out är aktiverat på en länkad server

  3. ORA-00942:Kan man välja från schema.table men inte tabell?

  4. Avpivot med kolumnnamn