更新Grails中父域类中的"lastUpdated"字段

ant*_*son 12 grails grails-orm grails-domain-class

我有一个父域类,它有hasMany另一个域类.父域和子域类都具有lastUpdateddateCreated字段.我的问题是,当我更新子域类时,我需要父域类来反映该更改并更新其lastUpdated字段.

Grails提供的父和子之间是否有任何映射或其他配置可以实现此功能?

更新

我将以下行添加到子域类:

def beforeUpdate = {
    parent.lastUpdated = new Date()
}
Run Code Online (Sandbox Code Playgroud)

我还必须在控制器中确保当我更新一个孩子时,我还必须保存父母以保持新lastUpdated字段.这似乎工作正常,但我仍然想知道是否有映射或类似的东西会这样做.

A.J*_*own 2

我有一种感觉,你建议的实施会有问题。您parent通过lastUpdated手动设置日期来更新,这可能会lastUpdated导致 grails在对其进行脏检查后再次更新。如果是这种情况,您实际上会得到一个在您最初设置的日期之后发生的最后更新时间。在您的测试中,这可能只有几(毫秒)秒,但您不能保证这一点。

不仅如此,由于您增加了父级和子级的耦合,因此您的实现更难以维护。

我可以建议另一种实现吗?LastUpdated 字段应该表示特定域对象的更新时间。您要查找的日期并不完全相同,因此我不会尝试以“错误”的方式使用现有约定。听起来您想要父对象的日期是“上次修改子对象的时间”。

请改用公式。

为此,您可以使用公式。通过公式,您可以准确地获得您想要的内容,而无需直接修改父对象,并且您仍然可以使用动态查找器和其他 Grails 糖。

class Parent {
    ...
    Date lastChildUpdated

    static hasMany = [ children: Child ]

    static mapping = {
        ...
        lastChildUpdated formula: '(SELECT max(c.last_updated) FROM child c WHERE c.parent_id = id)'
    }
}
Run Code Online (Sandbox Code Playgroud)

每当您从数据库读取对象时,GORM 都会加载公式的值。现在,每当您保存子级时,父级将获得该属性的准确值,而无需触摸父级。