目前,我正在开发一个 Java EE 项目,该项目对持久性管理有一些重要的要求。用户对实体的更改首先需要在验证之前应用到某个工作副本,然后再应用到“实时数据”。对实时数据的任何更改也需要对它们进行一些记录,以允许审计。
实体通过 JPA 管理,Hibernate 将用作提供者。这是给定的,所以我们不会回避特定于 Hibernate 的东西。对于第一个要求,使用了两个持久性单元。一个将实体映射到“实时数据”表,另一个映射到“工作副本”表。对于第二个需求,我们将使用 Hibernate Envers,它非常适合我们的用例。
到现在为止还挺好。现在,当用户在(基于 Web 的)前端查看数据时,能够指示与实时数据相比,工作副本中哪些字段发生了更改将非常有用。不同的颜色就足够了。为此,我们需要某种方式来了解哪些属性已被更改。我的问题是,什么是解决这个问题的好方法?
使用 JavaBeans API,PropertyChangeListener
可能足以通知工作副本实体中的任何更改并保留一组。但是该集合也需要持久化,因为可以重新启动应用程序,并且更改可以在它们被验证并应用于实时数据之前长期存在。并且每次需要对实时数据进行更改以获取工作副本是不可行的(因此有两个持久性单元)。
我们还可以将工作副本与实时数据进行比较,并找到不同的字段。一些自省(introspection)和反射代码就足够了,但这似乎是处理密集型的,更不用说需要获取实时数据了。
也许我错过了一些简单的东西,或者有人知道我可以使用一个很棒的 JPA/Hibernate 功能。即使在将此类信息应用于实时数据之前,我无法避免创建(a)单独的数据库表来存储此类信息,但这种情况下的一些最佳实践或实际经验可能非常有用。
我意识到这是一个半开放的问题,但肯定其他人一定遇到过这样的要求。任何好的建议都会受到赞赏,任何指向现成解决方案的指针都将是一个很好的候选答案。
最佳答案
也许您可以使用 Hibernate 刷新实体事件监听器。脏属性是在刷新之前计算的。您可以将它们存储在数据库中的某个位置。
一个 sample code使用 Hibernate 的脏属性特性,这可能会给你一个想法。
关于jpa - 跟踪 JPA 中更改的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35345927/