PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

właściwa adnotacja hibernacji dla byte[]

Jaki jest przenośny sposób dodawania adnotacji do właściwości byte[]?

To zależy od tego, czego chcesz. JPA może utrwalać nieopisany byte[] . Ze specyfikacji JPA 2.0:

11.1.6 Podstawowa adnotacja

Basic adnotacja jest najprostszym typem mapowania do kolumny bazy danych. Basic Adnotację można zastosować do trwałej właściwości lub zmiennej instancji dowolnego z następujących typów:prymityw Java, typy, opakowania typów pierwotnych,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[] , wyliczenia i każdy inny typ, który implementuje Serializable .Jak opisano w Sekcji 2.8, użycie Basic adnotacja jest opcjonalna dla trwałych pól i właściwości tych typów. Jeśli adnotacja podstawowa nie jest określona dla takiego pola lub właściwości, zostaną zastosowane domyślne wartości adnotacji podstawowej.

Hibernate zmapuje go "domyślnie" na VARBINARY SQL (lub SQL LONGVARBINARY w zależności od Column size?), które PostgreSQL obsługuje za pomocą bytea .

Ale jeśli chcesz byte[] aby był przechowywany w dużym obiekcie, powinieneś użyć @Lob . Ze specyfikacji:

11.1.24 Adnotacja do lobby

Lob adnotacja określa, że ​​trwała właściwość lub pole powinny być utrwalane jako duży obiekt dla typu dużego obiektu obsługiwanego przez bazę danych. Aplikacje przenośne powinny używać Lob adnotacja podczas mapowania do bazy danych Lob rodzaj. Lob adnotacja może być używana w połączeniu z adnotacją theBasic lub z ElementCollection adnotacja, gdy wartość kolekcji elementu jest typu podstawowego. Lob może być binarnym typem orcharakteru. Lob typ jest wywnioskowany z typu trwałego pola lub właściwości i, z wyjątkiem typów ciągów i znaków, domyślnie jest to Blob.

Hibernate zmapuje go do BLOB SQL które PostgreSQL obsługuje za pomocą oid .

Czy zostało to naprawione w jakiejś najnowszej wersji hibernacji?

Cóż, problem polega na tym, że nie wiem, na czym dokładnie polega problem. Ale mogę przynajmniej powiedzieć, że nic się nie zmieniło od 3.5.0-Beta-2 (czyli tam, gdzie wprowadzono zmianę) w gałęzi 3.5.x.

Ale moje zrozumienie problemów takich jak HHH-4876, HHH-4617 oraz PostgreSQL i BLOB (wspomnianych w javadoc PostgreSQLDialect ) jest to, że powinieneś ustawić następującą właściwość

hibernate.jdbc.use_streams_for_binary=false

jeśli chcesz użyć oid tj. byte[] z @Lob (co rozumiem od czasu VARBINARY nie jest tym, czego chcesz od Oracle). Czy próbowałeś tego?

Jako alternatywę HHH-4876 sugeruje użycie przestarzałego PrimitiveByteArrayBlobType aby uzyskać stare zachowanie (przed Hibernate 3.5).

Referencje

  • Specyfikacja JPA 2.0
    • Sekcja 2.8 „Domyślne mapowanie pól lub właściwości niezwiązanych z relacjami”
    • Sekcja 11.1.6 „Podstawowa adnotacja”
    • Sekcja 11.1.24 „Adnotacja w lobby”

Zasoby

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. org.postgresql.util.PSQLException:FATAL:przepraszam, już za dużo klientów

  2. Aktualizacja wersji Docker PGMASTER PostgreSQL

  3. Postgres Error:Więcej niż jeden wiersz zwrócony przez podzapytanie użyte jako wyrażenie

  4. Aktualizacja PostgreSQL 11 do PostgreSQL 13 z TimescaleDB i PostGIS w systemie Linux przy użyciu pg_upgrade

  5. PSQLException:Zestaw wyników nie jest prawidłowo ustawiony, być może trzeba wywołać następny