1

多数のメンバー変数を持つドメイン クラスがあります。次のように見えるとしましょう。

class Foo {
    String BARID
    int NUM1
}

オブジェクトを永続化しようとすると、Hibernate が例外をスローし ("org.springframework.orm.hibernate3.HibernateSystemException: クラスに間違ったタイプの ID が提供されました")、ID は String ではなく Long 型である必要があると不平を言います...しかし、BARID を実際にテーブル内の id にしたくありません。無関係な理由から、単にそのように名前が付けられています。ダウンストリームの互換性のために、オブジェクトとデータベースの両方でその変数を BARID として表示する必要があります (他のプログラムでは BARID と呼ぶ必要があります)。

明らかに、Hibernate は内部で凝っていて、どのフィールドが ID であるかを把握しようとしています。Hibernate の考えに反して、これは id フィールドではないことをどのように伝えることができますか?

更新: 変数の大文字と小文字が非標準であることは認識していますが、これが壊れている理由でない限り、そのままにしておくことをお勧めします。(記録のために、すべて小文字の「barid」に切り替えてみましたが、まったく同じ例外が発生しました)。

解決策: マッピング ブロックを明示的に定義する Jeff の提案した解決策を使用しました。

static mapping = {
    id generator: 'increment'
}
4

1 に答える 1

1

とにかく通常の id フィールドが必要なように聞こえるので、それをドメインオブジェクトに追加するだけで問題ないはずです Grails 2.3.1でこれをテストしました

class Foo {
    Long id
    String BARID
    int NUM1
}

また、その方法を使用したくない場合は、いつでもマッピング ブロックを使用して ID を構成できます。Doc Here

于 2013-11-07T19:21:38.723 に答える