不更改属性的Grails保存不会触发beforeUpdate

时间:2014-05-02 17:05:17

标签: grails groovy save gorm beforeupdate

我有一个问题,我有一个名为Cicle的域类,它通过从名为Measurement的其他域类的集合中得到一个平均值来计算其某些属性的值,因此如果其任何Measurements更新,那么Cicle应该也要更新。

问题在于我在beforeUpdate方法中计算平均值,但是如果Cicle属性没有改变,则不会触发此方法,并且当Cicle在beforeUpdate方法中更改其属性时,则更改不是&# 39;存储。

这是正常行为吗?有没有办法强制保存即使属性看起来相同?我尝试了flush:true,验证:false,没有运气,我应该在保存所有时间之前调用我的方法吗?或者这是一个错误,我应该告诉grails?或者是否有我应该实施的最佳做法?

谢谢

2 个答案:

答案 0 :(得分:2)

  

我有一个名为Cicle的域类,它通过从名为Measurement的其他域类的集合中得到一个平均值来计算其某些属性的值,因此如果其任何Measurements更新,那么Cicle也应该更新。 / p>

您是否考虑过将平均值设为transient attribute?这将允许您仅在需要时完成计算,并节省数据库中的空间。

答案 1 :(得分:1)

这是正常行为。没有任何东西被保存的原因是因为没有任何东西被视为“肮脏”或变化。这是Hibernate的默认行为,这不是一个bug。 “如果没有任何改变,那就不要费心去保存任何东西。”

正如我在评论中所建议的那样,您可能最好在Measurements类上实现afterUpdate,以查找和更新任何受影响的圈子。这样你就可以封装调用来重新计算那里的平均值(我假设它会修改Circle的属性,从而将其标记为'脏',从而允许你持久化它)。