14

以前はvarchar(max)だった SQL-2005 データベースの列が、 nvarchar(max)に変更されました。

ここで、変更を反映するために休止状態のマッピング ファイルを更新する必要があります。これが以前の状態です。

<要素の種類="テキスト" 列="値"/>

アプリケーションを実行しようとすると、次のエラーが表示されます。

org.hibernate.HibernateException: [テーブル] の列値の列タイプが正しくありません。検出: ntext、予想: text

列をnvarchar(max)として正しくマップするには、「type」属性に何を入力する必要がありますか?

タイプをntextに設定しようとしましたが、休止状態はそれが何であるかを知りませんでした。タイプをstringに設定しようとしましたが、文字列テキストタイプとして扱いました。

4

4 に答える 4

20

私にとってうまくいったのは、実際の列定義を @Column 注釈に入れることです。

    @Column(name="requestXml", columnDefinition = "ntext")
private String request;
于 2012-06-27T12:31:43.407 に答える
7

Tremend Tech Blogで答えを見つけました。独自の SQLServerDialect クラスを作成する必要があります。次のようになります。

public class SQLServerNativeDialect extends SQLServerDialect {
     public SQLServerNativeDialect() {
         super();
         registerColumnType(Types.VARCHAR, "nvarchar($l)");
         registerColumnType(Types.CLOB, "nvarchar(max)");
     }

    public String getTypeName(int code, int length, int precision, int scale) throws HibernateException {
        if(code != 2005) {
            return super.getTypeName(code, length, precision, scale);
        } else {
            return "ntext";
        }
    }
}

このクラスは Hibernate の型を SQL 型にマップするため、クラスは nvarchar(max) SQL データ型を Hibernate のCLOBデータ型にマップします。

getTypeNameメソッドは、Hibernate がコード 2005 (nvarchar(max) データ型のように見える) でデータ型について尋ねたときに「ntext」を返すために使用されます。

最後に、休止状態の永続化ダイアレクトをこの新しい SQLServerDialect クラスに変更する必要があります。これにより、休止状態がデータ型を SQL データ型に変換できるようになります。

于 2009-07-08T20:20:02.790 に答える