18

異なるデータベースを切り替えるときに、ラージオブジェクト(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;
4

3 に答える 3

12

このフィールドマッピングはで定義されてorg.hibernate.dialect.PostgreSQLDialectおり、これをサブクラス化し、postgresで実行するときに変更された方言を使用するようにアプリを構成することで変更できます。

サブクラスの関連する呪文はおそらく置くことです

    registerColumnType( Types.BLOB, "bytea" );

を呼び出した後、コンストラクターでsuper()

于 2010-12-20T11:05:40.457 に答える
1

私にとってこれは、「postgresjdbcバージョンを9.3-1101.jdbc4に戻す」ことを意味している可能性があります。

  <dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>9.4-1200-jdbc41</version>
  </dependency>

同様に働いた。それより新しいものは失敗しました...

于 2018-01-30T21:37:04.513 に答える
1

このクラスは、Hibernate3.6以降非推奨になっています。最新のHibernateでは、@Type(type="org.hibernate.type.MaterializedBlobType")代わりに使用する必要があります。https://docs.jboss.org/hibernate/core/3.6/javadocs/deprecated-list.htmlおよびhttps://docs.jboss.org/hibernate/core/3.6/javadocs/org/hibernate/type/を確認してください詳細については、 MaterializedBlobType.htmlを参照してください。

于 2020-09-10T11:22:49.297 に答える