如上所述 - 如果持久调用失败,我们已经修改了模型,这意味着我们正在使用(现在已修改,但由于异常而实际上没有持久化)模型。如果这是在 Service 层而不是 EntityListener 内部,我们实际上可以在对该特定类的任何异常处理中完全调用 DAO 之前更改回我们更改的任何属性。
出于这个原因 - 将描述的模型更改最好限制在“ Service
”层对象,而不是“侦听器”(它应该只用于我们想要持久的额外信息,而不是我们将使用的实际模型数据在将来)?
问题不在于修改模型,而在于修改的语义。您可以在 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)。