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