sql >> Database teknologi >  >> RDS >> PostgreSQL

korrekt dvale-annotering for byte[]

Hvad er den bærbare måde at annotere en byte[]-egenskab på?

Det afhænger af, hvad du ønsker. JPA kan bestå en ikke-annoteret byte[] . Fra JPA 2.0-specifikationen:

11.1.6 Grundlæggende annotering

Basic annotering er den enkleste type tilknytning til en databasekolonne. Basic annotering kan anvendes på en persistent egenskab eller instansvariabel af enhver af følgende typer:Java primitive, typer, wrappers af de primitive typer,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 og enhver anden type, der implementerer Serializable .Som beskrevet i afsnit 2.8, brugen af ​​Basic annotering er valgfri for vedvarende felter og egenskaber af disse typer. Hvis den grundlæggende annotation ikke er specificeret for sådan en mark eller ejendom, vil standardværdierne for den grundlæggende annotation være gældende.

Og Hibernate vil kortlægge det "som standard" til en SQL VARBINARY (eller en SQL LONGVARBINARY afhængigt af Column størrelse?), som PostgreSQL håndterer med en bytea .

Men hvis du vil have byte[] for at blive gemt i et stort objekt, skal du bruge en @Lob . Fra specifikationen:

11.1.24 Lob-annotering

En Lob annotation specificerer, at apersistent egenskab eller felt skal bestå som et stort objekt til en database-understøttet stor objekttype. Bærbare applikationer skal bruge Lob annotation ved tilknytning til en database Lob type. Lob annotation kan bruges sammen med den grundlæggende annotation eller med ElementCollection annotation, når elementsamlingsværdien er af basistype. En Lob kan enten være en binær eller karaktertype. Lob type udledes af typen af ​​det vedvarende felt eller egenskab og, bortset fra streng- og tegntyper, er standarden Blob.

Og Hibernate vil knytte det til en SQL BLOB som PostgreSQL håndterer med en oid .

Er dette rettet i nogle nyere versioner af dvaletilstand?

Nå, problemet er, at jeg ikke ved, hvad problemet præcist er. Men jeg kan i det mindste sige, at intet har ændret sig siden 3.5.0-Beta-2 (hvilket er hvor en ændring er blevet indført) i 3.5.x-grenen.

Men min forståelse af problemer som HHH-4876, HHH-4617 og PostgreSQL og BLOB'er (nævnt i javadoc af PostgreSQLDialect ) er, at du skal angive følgende egenskab

hibernate.jdbc.use_streams_for_binary=false

hvis du vil bruge oid dvs. byte[] med @Lob (hvilket er min forståelse siden VARBINARY er ikke, hvad du ønsker med Oracle). Har du prøvet dette?

Som et alternativ foreslår HHH-4876 at bruge den forældede PrimitiveByteArrayBlobType for at få den gamle adfærd (pre Hibernate 3.5).

Referencer

  • JPA 2.0-specifikation
    • Afsnit 2.8 "Kortlægning af standarder for ikke-relationsfelter eller egenskaber"
    • Afsnit 11.1.6 "Grundlæggende annotering"
    • Afsnit 11.1.24 "Lob-annotering"

Ressourcer

  • http://opensource.atlassian.com/projects/hibernate/browse/HHH-4876
  • http://opensource.atlassian.com/projects/hibernate/browse/HHH-4617
  • http://relation.to/Bloggers/PostgreSQLAndBLOBs


  1. Min MySQL-database er løbet tør for diskplads

  2. Hvordan eksporterer man data med Oracle SQL Developer?

  3. Hvordan modellerer du effektivt arv i en database?

  4. Slet forespørgsel virker ikke i mysql