異なるデータベースを切り替えるときに、ラージオブジェクト(BLOB)を含むHibernateマッピングに関して奇妙な問題が発生します。
@Lob
private byte[] binaryData;
上記のフィールドは、MySQLとOracleでバイト配列フィールドを作成しますが、PostreSQLではoid型のフィールドを作成します。
このフィールドにアクセスしようとすると、他のデータベースでは正常に機能しますが、PostgreSQLでは次のエラーで失敗します
Column "binaryData" is of type oid but expression is of type bytea.
そこで、PostgreSQLの問題を解決する「@Lob」アノテーションを削除しようとしましたが、このアノテーションのないMySQLでは、hibernateは「tinyblob」タイプのフィールドを作成します。これはほとんどの場合小さすぎます。また、このプロジェクトを複数の環境で使用したいので、2つの異なるマッピングを切り替えるのは面倒です。
@Lobでアノテーションが付けられたフィールドにpostgreSQLがoidの代わりにbyteaを使用するように強制するアノテーションはありますか?または、@ Lobを使用する場合と同じように、MySQLに大きなデータ型を割り当てるように強制するために、@ Lobを省略して、他の何かを配置することはどういうわけか可能ですか?
私はこのような解決策を想像することさえできました
if (field is of type oid)
store it as oid
else if (field is of type bytea)
store it as bytea
else
// not storable
ゲッターと同じですが、これを行う方法があれば
編集:
次の宣言が機能しています。列をoidとして割り当てますが、これを使用して休止状態にすると、そのようなフィールドからデータを保存および取得する方法がわかります。
@Lob
@Type(type="org.hibernate.type.PrimitiveByteArrayBlobType")
private byte[] binaryFile;