0

ドメインクラス構造の特殊なケースがあり、3つのクラスが存在し、それらがチェーンに接続されています。イベント<-ルーム<-プロジェクター。(すべての関係船は1対1です)

実装は次のようになります。

class Event {
    Room room
    static constraints = {
        room(nullable:false)
    }
}
class Room {
    Projector projector = new Projector()
    static belongsTo = [event: Event]
    static constraints = {
        projector(nullable:false)
    }
}
class Projector {
    String something = "Something"
    static belongsTo = [room: Room]
    static constraints = {
        room(nullable:false)
    }
}

新しい部屋でイベントを作成したい場合、プロジェクターはデフォルトで作成されると思います。

class TestController {
    def index() {
        Room room = new Room()
        Event event = new Event(room: room)
        event.save(flush: true, failOnError: true)
        render event
    }
}

次の例外が発生します

| Error 2012-07-11 16:09:12,541 [http-bio-8080-exec-3] ERROR errors.GrailsExceptionResolver  - TransientObjectException occurred when processing request: [GET] /Test/room/index
object references an unsaved transient instance - save the transient instance before flushing: Projector. Stacktrace follows:
Message: object references an unsaved transient instance - save the transient instance before flushing: Projector
    Line | Method
->>   46 | onApplicationEvent in org.grails.datastore.mapping.engine.event.AbstractPersistenceEventListener
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|     18 | index              in RoomController
|   1110 | runWorker . . . .  in java.util.concurrent.ThreadPoolExecutor
|    603 | run                in java.util.concurrent.ThreadPoolExecutor$Worker
^    722 | run . . . . . . .  in java.lang.Thread

3つのクラスをカスケードしても、デフォルト値は保存されないようです。そのための解決策はありますか?または私は何が間違っているのですか?

4

1 に答える 1

0

http://jira.grails.org/browse/GRAILS-4613?attachmentOrder=descに、問題の公開されている Jira があります。

個人的には、ドメインではなくコントローラーでオブジェクトの作成を処理します。project.save(flush:true) を呼び出すことができる必要があります。

于 2012-07-11T19:45:59.133 に答える