PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

правилна анотация за хибернация за байт[]

Какъв е преносимият начин за анотиране на свойство byte[]?

Зависи какво искаш. JPA може да запази неанотиран byte[] . От спецификацията на JPA 2.0:

11.1.6 Основна анотация

Basic анотацията е най-простият тип на съпоставяне с колона на база данни. Basic анотацията може да се приложи към постоянно свойство или променлива на екземпляра на някой от следните типове:примитив на Java, типове, обвивки на примитивните типове,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 и всеки друг тип, който имплементира Serializable .Както е описано в раздел 2.8, използването на Basic анотацията не е задължителна за постоянни полета и свойства от тези типове. Ако основната анотация не е посочена за такова поле или свойство, ще се прилагат стойностите по подразбиране на основната анотация.

И Hibernate ще съпостави a it "по подразбиране" към SQL VARBINARY (или SQL LONGVARBINARY в зависимост от Column размер?), които PostgreSQL обработва с bytea .

Но ако искате byte[] за да се съхранява в голям обект, трябва да използвате @Lob . От спецификацията:

11.1.24 Lob анотация

A Lob анотацията указва, че свойството или полето apersistent трябва да бъде запазено като голям обект за тип голям обект, поддържан от база данни. Преносимите приложения трябва да използват Lob анотация при съпоставяне с база данни Lob Тип. Lob анотацията може да се използва във връзка с основната анотация или сElementCollection анотация, когато стойността на колекцията на елементите е от основен тип. A Lob може да бъде или бинарен или тип символ. Lob Типът се извежда от типа на постоянното поле или свойство и, с изключение на типовете низове и знаци, по подразбиране е Blob.

И Hibernate ще го съпостави с SQL BLOB които PostgreSQL обработва с oid .

Това коригирано ли е в някоя последна версия на хибернация?

Е, проблемът е, че не знам какъв точно е проблема. Но мога поне да кажа, че нищо не се е променило от 3.5.0-Beta-2 (което е мястото, където е въведена промяна) в клона 3.5.x.

Но моето разбиране за проблеми като HHH-4876, HHH-4617 и за PostgreSQL и BLOB (споменати в javadoc на PostgreSQLDialect ) е, че трябва да зададете следното свойство

hibernate.jdbc.use_streams_for_binary=false

ако искате да използвате oid т.е. byte[] с @Lob (което е моето разбиране от VARBINARY не е това, което искате с Oracle). Опитахте ли това?

Като алтернатива HHH-4876 предлага използването на отхвърления PrimitiveByteArrayBlobType за да получите старото поведение (преди Hibernate 3.5).

Препратки

  • Спецификация на JPA 2.0
    • Раздел 2.8 „По подразбиране на картографиране за полета или свойства, които не са свързани“
    • Раздел 11.1.6 „Основна анотация“
    • Раздел 11.1.24 „Анотация на дялове“

Ресурси

  • 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. postgresql:INSERT INTO ... (ИЗБЕРЕТЕ * ...)

  2. hasMany извика с нещо, което не е екземпляр на Sequelize.Model

  3. Как използвате скриптови променливи в psql?

  4. Последователностите не са засегнати от транзакции?

  5. Клауза IN с NULL или IS NULL