我感觉你建议的实现会有问题。您正在通过手动parent
设置日期来更新,这可能会导致 grails在对其进行脏检查后再次更新。如果是这种情况,您实际上会得到一个 lastUpdated 时间,该时间发生在您最初设置的日期之后。在您的测试中,这可能只有几(毫秒)秒,但您不能保证。lastUpdated
lastUpdated
不仅如此,您的实现也更难维护,因为您增加了 Parent 和 Child 的耦合。
我可以建议另一种实现吗?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)'
}
}
每当您从数据库中读取对象时,GORM 都会加载公式的值。现在,每当您保存子项时,父项将获得该属性的准确值,而无需触摸父项。