我有一个Note域类,保存新笔记时,我需要为其创建一个NoteEvent,以备后代记录该笔记已创建。 Note包含一个NoteEvents的集合,每个NoteEvent跟踪其所属的Note
Note类:

class Note {
    String noteText
    Date dateCreated

    static hasMany = [events : NoteEvent]
}
NoteEvent类:
class NoteEvent {
    Date dateCreated
    String type

    static belongsTo = [note : Note]
}

为了在创建便笺时处理新的NoteEvents的保存,我使用了afterInsert,因为我要在各处保存便笺实例(每次保存一个便笺后要使用特定的事件创建代码都是重复的且耗时的新注释),并且beforeInsert显然还没有处理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()。但是,在“after”事件的情况下,这是对save()的第二次调用。因此,当我第一次保存一个新实例并调用afterInsert时,刚刚保存的实例会立即再次保存,这会触发afterUpdate事件,现在我有两个note事件:“创建”事件是我刚刚创建的事件保存便笺,并且从“创建”便引起便笺再次保存时的“更新”便笺。

我不清楚在这种情况下如何使用“之前”事件会有所帮助。我还能怎么做?

最佳答案

您实际上可以使用beforeInsertbeforeUpdate方法。这是因为addTo*方法不需要Note作为持久实例。

保存NoteEvent时将保存Note,因为在将NoteEvent保存到Note方法中之前先添加了beforeUpdate。查看 addTo* docs以获得更详细的说明。

我能够同时获得以下两个Note类,以使它们相信您希望它们起作用。我确实遇到了一个问题,当更新Note时,将添加两个NoteEvent对象。我能够通过确保 Controller 的更新方法使用noteInstance.save()而不是noteInstance.save(flush:true)来解决此问题。

class Note {
    String noteText
    Date dateCreated

    static hasMany = [events : NoteEvent]

    def beforeInsert = {
        def event = new NoteEvent(type: "CREATED")
        addToEvents(event)
    }

    def beforeUpdate = {
        def event = new NoteEvent(type: "UPDATED")
        addToEvents(event)
    }
}

如果您想要一个更精简的版本,addTo*方法知道要添加的对象类型,您可以使用MapNoteEvent构造函数
class Note {
    String noteText
    Date dateCreated

    static hasMany = [events : NoteEvent]

    def beforeInsert = {
        addToEvents(type: "CREATED")
    }

    def beforeUpdate = {
        addToEvents(type: "UPDATED")
    }
}

10-06 16:14