如上所述 - 如果持久调用失败,我们修改了模型,这意味着我们正在使用(现在已修改但由于异常而未实际持久化)模型。如果这是在Service层而不是EntityListener中,我们实际上可以更改我们在该特定类的任何异常处理中完全调用DAO之前更改的任何属性。
出于这个原因 - 所描述的模型的更改最好局限于'Service
'层对象,而不是'监听器'(它应该只用于我们想要保留的额外信息,而不是比我们将来会使用的实际模型数据?
答案 0 :(得分:2)
问题不在于修改模型,而在于修改的语义。 你可以在这个例子中从Hibernate文档中看到@PrePersist在保持模型之前从模型中更改lastUpdate日期。此方法仅修改可以限定为元数据的内容。
public class LastUpdateListener {
/**
* automatic property set before any database persistence
*/
@PreUpdate
@PrePersist
public void setLastUpdate(Cat o) {
o.setLastUpdate( new Date() );
}
}
如果您想要的是修改业务模型数据,那么服务层就是您需要将代码放在其他人期望的位置的地方(http://en.wikipedia.org/wiki/Principle_of_least_astonishment)。