Hibernate EntityListeners - 在持久化调用之前修改模型的PrePersist方法 - 如果持久调用失败怎么办?

时间:2013-10-21 09:55:31

标签: java hibernate

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

出于这个原因 - 所描述的模型的更改最好局限于'Service'层对象,而不是'监听器'(它应该只用于我们想要保留的额外信息,而不是比我们将来会使用的实际模型数据?

1 个答案:

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