0

如上所述 - 如果持久调用失败,我们已经修改了模型,这意味着我们正在使用(现在已修改,但由于异常而实际上没有持久化)模型。如果这是在 Service 层而不是 EntityListener 内部,我们实际上可以在对该特定类的任何异常处理中完全调用 DAO 之前更改回我们更改的任何属性。

出于这个原因 - 将描述的模型更改最好限制在“ Service”层对象,而不是“侦听器”(它应该只用于我们想要持久的额外信息,而不是我们将使用的实际模型数据在将来)?

4

1 回答 1

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)。

于 2013-10-21T11:42:14.130 回答