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
の使用 これらのタイプの永続フィールドおよびプロパティの注釈はオプションです。そのようなフィールドまたはプロパティにBasicannotationが指定されていない場合、Basicアノテーションのデフォルト値が適用されます。
そして、Hibernateはそれを「デフォルトで」SQL VARBINARY
にマップします (またはSQL LONGVARBINARY
Column
によって異なります サイズ?)PostgreSQLがbytea
で処理する 。
ただし、byte[]
が必要な場合 ラージオブジェクトに保存するには、@Lob
を使用する必要があります 。仕様から:
11.1.24ロブアノテーション
Lob
アノテーションは、永続的なプロパティまたはフィールドを、データベースでサポートされているラージオブジェクトタイプに対してラージオブジェクトとして永続化する必要があることを指定します。ポータブルアプリケーションでは、Lob
を使用する必要があります。 データベースにマッピングするときの注釈Lob
タイプ。Lob
アノテーションは、BasicアノテーションまたはElementCollection
と組み合わせて使用できます。 要素コレクションの値がbasictypeの場合の注釈。Lob
バイナリタイプまたは文字タイプのいずれかです。Lob
typeは、永続フィールドまたはプロパティのタイプから推測され、文字列と文字のタイプを除いて、デフォルトはBlobです。
そして、HibernateはそれをSQL BLOB
にマップします PostgreSQLがoid
で処理する 。
これは、Hibernateの最近のバージョンで修正されていますか?
さて、問題は私が問題が正確に何であるかわからないということです。しかし、少なくとも、3.5.xブランチの3.5.0-Beta-2(変更が導入された場所)から何も変更されていないと言えます。
しかし、HHH-4876、HHH-4617、PostgreSQLおよびBLOB(PostgreSQLDialect
のjavadocに記載)などの問題についての私の理解 )は、次のプロパティを設定することになっているということです
hibernate.jdbc.use_streams_for_binary=false
oid
を使用する場合 つまり、byte[]
@Lob
を使用 (これはVARBINARY
以来の私の理解です Oracleで望むものではありません)。これを試しましたか?
別の方法として、HHH-4876は、非推奨のPrimitiveByteArrayBlobType
を使用することを提案しています。 古い動作(Hibernate 3.5より前)を取得します。
参考資料
- JPA2.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