跟踪 JPA 中更改的属性

Keeping track of changed properties in JPA

目前,我正在从事一个 Java EE 项目,该项目对持久性管理有一些重要的要求。用户对实体的更改首先需要在验证之前应用到某个工作副本,然后再应用到 "live data"。对实时数据的任何更改也需要有一些记录,以允许审计。

实体通过 JPA 进行管理,Hibernate 将用作提供程序。这是给定的,所以我们不会回避特定于 Hibernate 的内容。对于第一个要求,使用了两个持久化单元。一个将实体映射到 "live data" tables,另一个映射到 "working copy" tables。对于第二个要求,我们将使用 Hibernate Envers,它非常适合我们的用例。

到目前为止一切顺利。现在,当用户在(基于 Web 的)前端查看数据时,能够指出与实时数据相比工作副本中哪些字段发生了更改将非常有用。不同的颜色就足够了。为此,我们需要某种方式来了解哪些属性被更改了。我的问题是,解决这个问题的好方法是什么?

使用 JavaBeans API,一个 PropertyChangeListener 足以通知工作副本实体的任何更改并保留一组更改。但是该集合也需要持久化,因为应用程序可以重新启动,并且更改可以在验证并应用于实时数据之前长期存在。并且在每次需要时对实时数据应用更改以获取工作副本是不可行的(因此有两个持久性单元)。 我们还可以将工作副本与实时数据进行比较,并找到不同的字段。一些内省和反射代码就足够了,但这似乎又是处理密集型的,更不用说需要获取实时数据了。 也许我遗漏了一些简单的东西,或者有人知道我可以使用的一个很棒的 JPA/Hibernate 功能。即使我无法避免制作 (a) 单独的数据库 table(s) 来存储此类信息,直到它被应用于实时数据,一些最佳实践或这种情况下的现实生活经验可能非常有用.

我知道这是一个半开放的问题,但肯定其他人一定遇到过这样的需求。任何好的建议都会受到赞赏,任何指向现成解决方案的指针都可以作为公认的答案。

也许您可以使用 Hibernate 刷新实体事件侦听器。脏属性在刷新之前计算。您可以将它们存储在数据库中的某个位置。

关于使用 Hibernate 的脏属性功能的 sample code 可能会给您一个想法。