2011-07-08 8 views
0

Contributorという名前のクラスに評価リストをロードしようとしていますが、テストをパスすることができないため、何か不足しています。Grails GORMオブジェクトのコレクションの読み込み

私のテストでは、Evaluations.list()とContributor.list()を実行して値を出力すると、保存したデータが表示されるため、期待どおりにオブジェクトを作成して保存しています。

また、評価を選択して、その「寄稿者」プロパティの値を印刷すると、正しいと思われます。

しかしContributorを選択し、その 'evaluationations'プロパティの値を出力するとnullになります。

私のマッピングが問題だと思いますか?

class Contributor { 
    String name 

    static hasMany = [evals:Evaluation] 

    static mapping = { 
     id column: 'user_id' 
     evals joinTable:[name:'evaluation', column:'eval_id', key:'eval_user_id'] 
     version false 
    } 
} 

class Evaluation { 
    Contributor contributor 
    String comment 

    static mapping = { 
     id column:'eval_id' 
     contributor column:'eval_user_id' 
     version false 
    } 
} 

ありがとう。

答えて

2

evalsにはcontributor.evals = [eval]を指定しないでください。動的メソッドaddTo*()contributor.addToEvals(eval)を呼び出します。これにより、後で保持されるevalsのHibernateコレクションが作成されます。

eval.contributorを割り当てたときにGrailsが他の関連付けを割り当てない、つまりcontributor.addToEvals(eval)を呼び出さないため、最初のものは機能しませんでした。なぜ私は考えていない - 何らかの実装理由がなければならない。

したがってcontributorは、Hibernateキャッシュ内に同じ空きのevalsが残っています。アソシエーションがテーブルの外部キーEvalにのみマップされているため、キャッシュから外れて再読み込みすると、evalsが埋め込まれます。

空のevalsはnullです。これは、別のHibernateの機能です。コレクションが空の場合、nullにすることができます。ただそれを知っている。

ここでは、いくつかのHibernateの内部を説明する良い短い記事です:http://blog.xebia.com/2008/03/advanced-hibernate-proxy-pitfalls/

0

ああ私はそれを騒ぎました。問題は私がオブジェクトを保存する方法です。

次は動作しません:

def contributor = new Contributor([name:'Homer']).save(failOnError:true) 
def eval = new Evaluation([contributor:contributor, comment:'Must read article']).save(failOnError:true) 

この

def contributor = new Contributor([name:'Homer']).save(failOnError:true) 
def eval = new Evaluation([contributor:contributor, comment:'a comment']).save(failOnError:true) 
contributor.evals = [eval] 
contributor.save(failOnError:true) 

それともこれは、作業を行います。

def contributor = new Contributor([name:'Homer']) 
def eval = new Evaluation([contributor:contributor, comment:'a comment']) 
contributor.evals = [eval] 
contributor.save(failOnError:true) 

ない保存方法のトップは」doesnの理由を私は完全に理解してくださいコントリビュータのIDが評価に保存されているため、データを選択するときには機能しません。

関連する問題