sql >> Database >  >> RDS >> PostgreSQL

juiste slaapstand-annotatie voor byte[]

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


  1. Tool voor vertaling van Oracle PL/SQL naar Postgresql PL/pgSQL

  2. 6 manieren om uw MariaDB-versie te controleren

  3. Sorteer op kolom ASC, maar eerst NULL-waarden?

  4. Salesforce SOQL van Windows PowerShell