3

すべての Event タイプで共有されるプロパティを保持する抽象Eventクラスがあり、その下にはクラスごとに 1 つのテーブルを持つ 2 つのサブクラス (MasterEventParentEvent) があります。

問題はMasterEvent、id 列の型が「number」であり、列ParentEventの型が「varchar2」であることです。これは、アプリを実行しようとすると、次のようになることを意味します。

HibernateException が原因: 列 event_id の * の列タイプが正しくありません。見つかった: number、予想: varchar2(255 文字)。

これは従来のデータベースであるため、データベース レベルで列の型を変更する可能性がないことに注意してください。

以下のサンプル コードは、理解を深めるのに役立ちます。

Event.groovy


package a

abstract class Event {
    String id

    static mapping = {
        tablePerHierarchy "false"
        id column: "id"
    }
}

ParentEvent.groovy


package a

class ParentEvent extends Event {
    static mapping = {
        id column: "id"
    }
}

MasterEvent.groovy


package a

class MasterEvent extends Event {
    static mapping = {
        id column: "id", type: "number"
    }
}

type: numberあらゆる種類の組み合わせを試してみましたが、常に同じエラーが発生します。

sqlType直接キャストするか、Stringgrails にこの検証を無視させる方法はありますか?

4

3 に答える 3

1

type: 'number'休止状態の基本タイプではないため、機能しません

type: 'long'それを(またはレガシーDBに適合するもの)に変更してみてください

ドキュメントも参照してください:リンク


コメント後に編集する

抽象クラスで何をしているのかわかりませんが、おそらくそのようなことをして、抽象クラスでゲッターを使用することができます(テストされていません!):

class MasterEvent extends Event {

    Long longId        
    static mapping = {
        longId column: "id"
    }

    @Override
    String getId() {
        longId?.toString()
    }   
}
于 2013-02-26T14:15:14.393 に答える
0

number id列を取り、それをStringに変換するカスタムHibernate UserTypeを試すことができます。これは MasterEvent クラスに入ります。

static mapping = {
    id column: "id", type: NumberToStringType
}
于 2013-02-26T18:49:13.513 に答える
0

サブクラスで id フィールドを定義しようとしましたか? 親イベントの「文字列ID」とマスターイベントの「長いID」?

于 2013-02-26T14:13:42.160 に答える