2012-02-23 16 views
0

GORMにはいくつかのレガシーデータベースマッピングがあり、いくつかは列挙型の主キーを持っています。列挙は、序数ではなく文字列値を使用して格納されます。例えばGrailsのIdフィールドとしてGroovy Enumを使用する

:あなたがインスタンスを取得しようとすると、あなたは

class AccountingGLMap { 
    AccountingTypeCode id 
    String typeCode 

    static mapping = { 
     id(column: 'accountingTypeCode', generator: 'assigned') 
    } 
} 

取得:

| Error 2012-02-23 10:32:41,319 [pool-5-thread-1] ERROR context.GrailsContextLoader - Error executing bootstraps: could not deserialize; nested exception is org.hibernate.type.SerializationException: could not deserialize 

私が正しく列挙にテーブルマップ内の値は、(私ができる与えられたことを確認しました主キーでない限りEnumでオブジェクトをインスタンス化します)。 EnumをStringに変更すると、すべて正常に動作します。

JPAを使用しているときに主キーとしてEnumを使用できないと主張している記事がありましたが、これにも異議がありました。

誰でもこれを行った経験がありますか?

EDIT:参考のため、Oracleデータベースに対して2.0.1を使用しています。

+0

私はちょうどメモリデータベースで使用してGrailsの1.3.7でこれを実行しようとしましたし、私が持っていました問題ない。どのGrailsのバージョンとどのタイプのデータベースを使用していますか? –

+0

申し訳ありませんが、Oracleで2.0.1を使用しています。 Enumがキーであるときだけ壊れるように見えます。そうでなければ、マッピングは正常に動作します。 – Aaron

答えて

0

あなたのIDマッピングにtype: 'string'を追加して、そのような文字列の入力を受け取りidのセッターを追加します。

class AccountingGLMap { 
    AccountingTypeCode id 
    GLTypeCode glTypeCode 

    static mapping = { 
     id(column: 'accountingTypeCode', type: 'string', generator: 'assigned') 
    } 

    void setId(String value) { 
     id = value 
    } 
} 
関連する問題