我有一個Note
域類,並且當保存一個新的筆記時,我需要爲它創建一個NoteEvent
,爲後代記錄該筆記已經創建。 Note
有一個NoteEvents
的集合,並且每個NoteEvent
都會跟蹤它屬於哪個Note
。Grails中的奇怪的afterInsert/afterUpdate循環
的Note
類:
class Note {
String noteText
Date dateCreated
static hasMany = [events : NoteEvent]
}
的NoteEvent
類:
class NoteEvent {
Date dateCreated
String type
static belongsTo = [note : Note]
}
要處理的新NoteEvents
節約創建一個音符的時候,我用afterInsert
,因爲我節省筆記(在每次保存一個新筆記之後,創建特定的事件代碼將會是重複和耗時的),並且顯然不涉及Note
的實例仍然存在 - NoteEvent
的note
沒有任何內容。
所以現在我Note
類:
class Note {
String noteText
Date dateCreated
static hasMany = [events : NoteEvent]
def afterInsert = {
def event = new NoteEvent(type: "CREATED")
addToEvents(event)
save()
}
}
但我也需要創建一個NoteEvent
當這些筆記中的一個更新,而這正是困惑和沮喪和顯著缺乏咖啡進來了。爲了在更新時附加一個新的「更新」NoteEvent
到筆記,我精心決定再次使用afterUpdate
,以避免在需要更新Note
實例時將事件創建代碼灑在整個應用程序中。
所以,現在,爲Note
,我有:
class Note {
String noteText
Date dateCreated
static hasMany = [events : NoteEvent]
def afterInsert = {
def event = new NoteEvent(type: "CREATED")
addToEvents(event)
save()
}
def afterUpdate = {
def event = new NoteEvent(type: "UPDATED")
addToEvents(event)
save()
}
}
要將新的事件添加到筆記的集合,我使用的是動態addTo()
方法,然後要求該實例的save()
。但在發生「之後」事件的情況下,這是第二次致電save()
。因此,當我第一次保存一個新實例並調用afterInsert
時,剛剛保存的實例會立即再次保存,這會導致事件被觸發,現在我有兩個音符事件:從剛剛創建的事件開始保存了該筆記,以及從「創建」筆記導致筆記再次保存時的「更新」筆記。
我不清楚在這種情況下如何使用「之前」的事件。我還能如何做到這一點?
我想你的意思是「不要求'NoteEvent'是一個持久化的實例。」:)無論如何:非常感謝你的答案。我試過了,它爲我工作。™ –