0

マスター レコード ( VocabularyTest ) と一連の詳細レコード ( VocabQuestion ) を同じフォームに入力できる UI を作成しました。送信されたデータが正しいことをとてもうれしく思いますが、マスター レコードを保存しようとすると、次のエラーが表示されます。

null id in vocabularytest.VocabQuestion entry 

編集 - 完全なスタックトレースは

null id in vocabularytest.VocabQuestion entry (don't flush the Session after an exception occurs). Stacktrace follows:
Message: null id in vocabularytest.VocabQuestion entry (don't flush the Session after an exception occurs)
    Line | Method
->>   24 | save      in vocabularytest.VocabularyController
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|    195 | doFilter  in grails.plugin.cache.web.filter.PageFragmentCachingFilter
|     63 | doFilter  in grails.plugin.cache.web.filter.AbstractFilter
|   1110 | runWorker in java.util.concurrent.ThreadPoolExecutor
|    603 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^    722 | run       in java.lang.Thread

編集終了

Detail レコードの外部キー参照が null であるため、これが発生していると想定していますが、設定するために何もしていないため、それほど驚くことではありません。

私のコントローラーが受け取っているParamsは次のとおりです

title: Dave New Test
testItems[0].question: Q1
testItems[0].answer: A1
testItems[1].question: Q2
testItems[1].answer: A2
testItems[2].question: Q3
testItems[2].answer: A3
create: Create

私のドメインオブジェクトは

class VocabularyTest {

    static hasMany = [testItems: VocabQuestion] 
    static constraints = {
    }

    String title;
    List <VocabQuestion>testItems = LazyList.decorate(
                                      new ArrayList(),
                                      FactoryUtils.instantiateFactory(VocabQuestion.class));

}
class VocabQuestion {

    static constraints = {

    }
    String question
    String answer
    VocabularyTest vocabularyTest

}

私のコントローラーの関連する方法は

def save() {
        log.debug(params)
        def vocabularyTestInstance = new VocabularyTest(params)
        if (!vocabularyTestInstance.save(flush: true)) {
            render(view: "create", model: [vocabularyTestInstance: vocabularyTestInstance])
            return
        }

        flash.message = message(code: 'default.created.message', args: [message(code: 'vocabularyTest.label', default: 'VocabularyTest'), vocabularyTestInstance.id])
        redirect(action: "index", id: vocabularyTestInstance.id)
    }

GORM と Grails が常に苦労するようなことをしようとしているのですか、それとも重要な何かを見逃しているだけですか?

4

1 に答える 1

0

これを試して:

class VocabularyTest {

    static hasMany = [testItems: VocabQuestion] 

    static constraints = {
    }

    String title 
    List testItems
}

class VocabQuestion {

    static constraints = {

    }
    static belongsTo = [vocabularyTest: VocabularyTest]  

    String question
    String answer
}
于 2013-05-29T20:26:45.890 に答える