我的应用程序使用大型域对象树,对于大多数这些对象,我想保留一些基本信息(更新者、修改时间等)。我已经将这些属性和列添加到我的应用程序中。
当我想到持久层应该透明地处理这个问题时,我正要在所有各种构造函数等中对这些值的设置进行编码。
但是怎么做?
我当然可以在我的 DAO 中做到这一点,但是如何处理通过级联保存持久化的对象呢?有没有办法拦截这些persist() 方法?
实现此功能的好方法是什么?
我的应用程序使用大型域对象树,对于大多数这些对象,我想保留一些基本信息(更新者、修改时间等)。我已经将这些属性和列添加到我的应用程序中。
当我想到持久层应该透明地处理这个问题时,我正要在所有各种构造函数等中对这些值的设置进行编码。
但是怎么做?
我当然可以在我的 DAO 中做到这一点,但是如何处理通过级联保存持久化的对象呢?有没有办法拦截这些persist() 方法?
实现此功能的好方法是什么?
您可能想看看Hibernate Envers。
如果您打算使用 JPA 进行审计,则可以依赖 PrePersist 和 PreUpdate 回调注释。JPA WikiBook 有一个这样的例子。在这种情况下,拥有一个映射的超类非常有帮助,否则您将继续通过“用户”空间代码执行此操作。
另一种方法是在表上使用触发器 (ahem)。不过,这确实会对性能产生影响。Openbravo ERP 项目似乎正在使用这种方法来生成审计跟踪。
更新:将审计功能分离到不同的类中是个好主意,而不是域模型的超类。JPA 事件侦听器将帮助您实现相同的目标。这里有一个很好的例子。