目前,我正在处理一个具有持久性管理方面的一些非常规要求的 Java EE 项目。用户对实体所做的更改首先需要应用到某个工作副本中,然后再进行验证,之后才会应用到“实时数据”上。在那个实时数据上做出的任何更改也需要有一些记录,以便进行审计。
这些实体是通过 JPA 管理的,而 Hibernate 将用作提供程序。这是一个给定的条件,因此我们不会回避与 Hibernate 相关的内容。对于第一个要求,使用了两个持久性单元。其中一个将实体映射到“实时数据”表,另一个将实体映射到“工作副本”表。对于第二个要求,我们将使用 Hibernate Envers,它非常适合我们的用例。
目前为止都很顺利。现在,当用户在(基于 Web 的)前端查看数据时,能够指示哪些字段在工作副本中与实时数据相比已更改将非常有用。使用不同的颜色就足够了。为此,我们需要一种方法来确定哪些属性已被更改。我的问题是,有什么好方法可以解决这个问题?
使用 JavaBeans API,PropertyChangeListener
可以足够地通知任何工作副本实体中的更改并保留它们的集合。但是,该集合还需要被持久化,因为应用程序可能会重新启动,并且更改在验证和应用于实时数据之前可能具有长期性质。每次需要它时将实时数据应用于工作副本以获取更改是不可行的(因此使用了两个持久性单元)。
我们也可以比较工作副本与实时数据并查找不同的字段。一些内省和反射代码就足够了,但是这似乎非常耗费处理能力,更不用说需要获取实时数据了。
也许我错过了某些简单的东西,或者有人知道我可以使用的一个出色的 JPA/Hibernate 功能。即使我无法避免(a)单独的数据库表存储此类信息,但对于这种情况的最佳实践或实际经验可能非常有用。
我知道这是一个半开放性的问题,但其他人肯定也遇到过类似的要求。欢迎提供任何好的建议,如果有现成解决方案的指针则更佳,可以作为被接受的答案。