13

Hibernateは、のプロパティではLONGなく、バージョン3.5.5(3.2.7からアップグレード)でデータ型の使用を開始したようです。CLOBtype="text"

LONGOracleのデータ型は使用すべきではない古い古いデータ型(http://www.orafaq.com/wiki/LONGを参照)であり、テーブルに複数の列を含めることはできないため、LONGこれが問題を引き起こしています。データ型。

なぜこれが変更されたのか誰かが知っていますか?

SetBigStringTryClobOracleプロパティをtrueに設定しようとしました( Hibernate> CLOB> Oracle :(で提案されているように)が、データ型マッピングには影響せず、私の場合とは関係のないデータ転送内部のみに影響します。

org.hibernate.dialect.Oracle9iDialectこれに対する1つの可能な修正は、 :をオーバーライドすることです。

public class Oracle9iDialectFix extends Oracle9iDialect {
  public Oracle9iDialectFix() {
    super();
    registerColumnType(Types.LONGVARCHAR, "clob");
    registerColumnType(Types.LONGNVARCHAR, "clob");
  }
}

ただし、これが最後の手段です。このクラスをオーバーライドすることは、Hibernateをフォークすることに一歩近づきます。

なぜこれが行われたのか誰かが説明できますか?これはバグとして提起されるべきですか?

[更新]:https ://hibernate.atlassian.net/browse/HHH-5569を作成しました。どうなるか見てみましょう。

4

3 に答える 3

4

なぜこれが行われたのか誰かが説明できますか?これはバグとして提起されるべきですか?

これはHHH-3892に対して行われました-SQLLONGVARCHARおよびCLOBをJavaStringに、SQLLONGVARBINARYおよびBLOBをJavabyte []に​​マッピングするためのサポートを改善します(ドキュメントの更新はHHH-4878によって追跡されます)。

そして同じ問題によると、古い振る舞いは間違っていました。

(注:現在、org.hibernate.type.TextTypeは「テキスト」を誤ってjava.sql.Types.CLOBにマップします。これはこの問題によって修正され、データベースダイアレクトで更新されます)

いつでも問題を提起することができますが、要するに、type="clob"プロパティをにマップする場合はを使用する必要があると私は理解していますCLOB

PS:独自のものを提供Dialectし、Hibernate構成(フォークとは関係ありません)で宣言することは、長期的な解決策ではありません。

于 2010-09-15T20:55:50.117 に答える
4

この問題の解決策は使用することであるように見えますmaterialized_clob。少なくとも、HHH-5569でGailBadnerが言っていることです。

これは私にはまったく役に立ちません(そして私はそれについて関連するコメントを残しました)が、ここで他の誰かに役立つかもしれません。とにかくバグは拒否され、私ができることはほとんどありませんが、オーバーライドされた方言を使用します:(

于 2011-01-11T11:21:50.393 に答える
1

理由についての質問には答えられませんが、Hibernate 6については、使用に戻すことを検討しているようです。CLOB

于 2019-07-05T15:25:08.300 に答える