如何删除Grails中的关联对象?

时间:2014-03-14 10:32:07

标签: grails gorm

我的grails应用程序中有域类,如下所示。我想做删除操作,这是我第一次在关联对象上执行删除操作 解释如下。

Attachment
----------
Class Attachment{
    static hasMany = [mailDrafts: MailDraft];
}

MailDraft
---------------
Class MailDraft{
    static hasMany = [attachments: Attachment]
    static belongsTo = Attachment

    Training training

    Boolean isSent
    String type

}

Training
--------------
Class Training{
    static hasMany = [attachments: Attachment]

    MailDraft infoDraft
    MailDraft reminderDraft

}

Trainer
------------
Class Trainer{
    MailDraft introMailDraft
} 

我正在运行一个批处理进程,删除所有带有标记' isSent = true'的邮件队列。以及该草案的附件

Case1: 

infoDraft (MailDraft  object)
-----------------------------
training: A training
attachments: [file1, file2]
isSent: true
type: 'info'

training: A training (Training  object)
-------------------------------------
attachments: [file1]

在上面的例子中,该过程应该删除' infoDraft'对象和' file2'附件但不是附件' file1',因为培训' A培训'已经得到了' file1'附件

Case2: 

introMailDraft (MailDraft  object)
-----------------------------
training: null
attachments: [file3]
isSent: true
type: 'intro'

在上面的例子中,该过程应该删除' introMailDraft'以及附件' file3'但在这种情况下,培训为空

在上述所有情况下,应更新关联表

怎么做?

1 个答案:

答案 0 :(得分:2)

因为您根据关联类的属性进行了条件删除,所以最好通过挂钩GORM事件并在那里实现逻辑来实现。例如:

class MailDraft {
    static hasMany = [attachments: Attachment]
    static belongsTo = Attachment

    Training training

    Boolean isSent
    String type

    def beforeDelete() {
      MailDraft.withNewSession {
        // examine state of this instance
        // and delete any related instances that meet my business logic requirements.
      }
    }
}

您可以在Grails文档的Advanced GORM部分找到更多信息。

相关问题