0

Job と Description という 2 つのドメイン クラスが、単純な 1 対多の関係にあります。

Job.groovy

class Job {
    static hasMany = [descriptions: Description]

    static mapping = {
        descriptions lazy: false
    }
}

説明.groovy

class Description {
    static belongsTo = [job: Job]
}

2 つのコントローラー アクションがあります。

def removeDescriptionFromJob(Long id) {
    def jobInstance = Job.get(id)

    System.out.println("before remove: " + jobInstance.descriptions.toString())

    def description = jobInstance.descriptions.find { true }
    jobInstance.removeFromDescriptions(description)
    jobInstance.save(flush: true)

    System.out.println("after remove: " + jobInstance.descriptions.toString())

    redirect(action: "show", id: id)
}

def show(Long id) {
    def jobInstance = Job.get(id)
    System.out.println("in show: " + jobInstance.descriptions.toString())
}

removeDescriptionFromJob にリクエストを送信すると、次のように出力されます。

before remove: [myapp.Description : 1]
after remove: []
in show: [myapp.Description : 1]

removeDescriptionFromJob アクションで Description が削除され、その直後に show アクションで戻ってくるのはなぜですか?

4

1 に答える 1

3

removeFromDescriptionsjobInstanceからの関係を削除しましdescriptionたが、エンティティdescriptionはまだ存在しています。

System.out.println("after remove: " + jobInstance.descriptions.toString())

リレーションが存在しないため、o/p は発生しません。上記の行の代わりに、次のように説明オブジェクトを直接取得してみてください。

System.out.println("after remove: " + Description.get(//id you just disassociated))

説明を正常に取得できます。

これを回避するには、以下のマッピング プロパティを追加してJob、エンティティが親から切り離されたときにすべてのオーファンを削除する必要があります。

descriptions cascade: "all-delete-orphan"

お気に入り:

class Job {
    static hasMany = [descriptions: Description]

    static mapping = {
        descriptions lazy: false, cascade: "all-delete-orphan"
    }
}

GORM バイブル- 必読。

于 2013-07-01T19:43:58.733 に答える