sql >> Databáze >  >> RDS >> PostgreSQL

správná anotace hibernace pro byte[]

Jaký je přenosný způsob, jak anotovat vlastnost byte[]?

Záleží na tom, co chcete. JPA může uchovat byte[] bez poznámek . Ze specifikace JPA 2.0:

11.1.6 Základní anotace

Basic anotace je nejjednodušší typ mapování na sloupec databáze. Basic anotace může být aplikována na trvalou vlastnost nebo proměnnou instance libovolného z následujících typů:primitivní Java, typy, obaly primitivních typů,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 a jakýkoli jiný typ, který implementuje Serializable .Jak je popsáno v části 2.8, použití Basic anotace je volitelná pro trvalá pole a vlastnosti těchto typů. Pokud není pro takové pole nebo vlastnost uvedena základní anotace, použijí se výchozí hodnoty základní anotace.

A Hibernate namapuje it "ve výchozím nastavení" na SQL VARBINARY (nebo SQL LONGVARBINARY v závislosti na Column velikost?), kterou PostgreSQL zpracovává pomocí bytea .

Ale pokud chcete byte[] pro uložení do velkého objektu byste měli použít @Lob . Ze specifikace:

11.1.24 Anotace Lob

Lob anotace určuje, že trvalá vlastnost nebo pole by měly být zachovány jako velký objekt typu velkého objektu podporovaného databází. Přenosné aplikace by měly používat Lob anotace při mapování do databáze Lob typ. Lob anotace může být použita ve spojení s anotací Basic nebo sElementCollection anotace, když je hodnota kolekce prvků základního typu. Lob může být buď binární nebo typ znaku. Lob typ je odvozen z typu trvalého pole nebo vlastnosti a kromě typů řetězců a znaků je výchozí Blob.

A Hibernate jej namapuje na SQL BLOB které PostgreSQL zpracovává pomocí oid .

Je to opraveno v některé nejnovější verzi hibernace?

No, problém je v tom, že přesně nevím, v čem je problém. Ale mohu alespoň říci, že se nic nezměnilo od 3.5.0-Beta-2 (což je místo, kde byla zavedena změna) ve větvi 3.5.x.

Ale moje chápání problémů jako HHH-4876, HHH-4617 a PostgreSQL a BLOB (zmíněno v javadocu PostgreSQLDialect ) je, že byste měli nastavit následující vlastnost

hibernate.jdbc.use_streams_for_binary=false

pokud chcete použít oid tj. byte[] s @Lob (což chápu od VARBINARY není to, co chcete s Oracle). Zkusili jste to?

Jako alternativu HHH-4876 navrhuje použít zastaralý PrimitiveByteArrayBlobType získat staré chování (před Hibernate 3.5).

Odkazy

  • Specifikace JPA 2.0
    • Část 2.8 „Mapování výchozích hodnot pro nerelační pole nebo vlastnosti“
    • Oddíl 11.1.6 „Základní anotace“
    • Oddíl 11.1.24 „Anotace lobu“

Zdroje

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


  1. 2 způsoby převodu mezi desítkovou a šestnáctkovou v MySQL

  2. Funkce hesla MySQL

  3. Srovnání fulltextového vyhledávače - Lucene, Sphinx, Postgresql, MySQL?

  4. Co dělá transakce kolem jednoho výpisu?