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バイナリタイプまたは文字タイプのいずれかです。Lobtypeは、永続フィールドまたはプロパティのタイプから推測され、文字列と文字のタイプを除いて、デフォルトは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「ロブアノテーション」
リソース
- https://opensource.atlassian.com/projects/hibernate/browse/HHH-4876
- https://opensource.atlassian.com/projects/hibernate/browse/HHH-4617
- https://relation.to/Bloggers/PostgreSQLAndBLOBs