目前,我正在从事一个Java EE项目,该项目具有一些关于持久性管理的重要需求。在验证之前,用户对实体的更改首先需要应用于一些工作副本,之后它们将应用于“实时数据”。实时数据上的任何更改也需要有一些记录,以便进行审计。
实体是通过JPA管理的,Hibernate将用作提供者。这是给定的,所以我们不会回避Hibernate特定的东西。对于第一个需求,使用了两个持久性单元。一个将实体映射到“活动数据”表,另一个映射到“工作副本”表。对于第二个需求,我们将使用Hibernate Envers,这非常适合我们的用例。
到目前一切尚好。现在,当用户在(基于web的)前端查看数据时,能够指出与实时数据相比,工作副本中的哪些字段发生了更改,这将是非常有用的。换一种颜色就够了。为此,我们需要一些方法来知道哪些属性被更改了。我的问题是,什么才是解决这个问题的好方法?
使用JavaBeans应用编程接口,PropertyChangeListener
就足以通知工作副本的实体中的任何更改,并保留一组更改。但是该集合也需要持久化,因为应用程序可能会重新启动,并且在验证更改并将其应用于实时数据之前,更改可能会持续很长时间。并且在每次需要时将更改应用于实时数据以获得工作副本是不可行的(因此使用两个持久性单元)。我们还可以将工作副本与实时数据进行比较,找出不同的字段。一些自省和反射代码就足够了,但这似乎又是相当处理密集型的,更不用说需要获取实时数据了。也许我遗漏了一些简单的东西,或者有人知道我可以使用一个很棒的JPA/Hibernate特性。即使我无法避免创建(一个或多个)单独的数据库表来存储此类信息,但在将其应用于实时数据之前,此场景的一些最佳实践或实际经验可能会非常有用。
我知道这是一个半公开的问题,但其他人肯定也遇到过这样的需求。任何好的建议都是值得感谢的,任何指向现成解决方案的指针都将是一个被接受的答案。
发布于 2016-04-12 21:32:03
也许你可以使用Hibernate flush实体事件侦听器。在刷新之前计算脏属性。您可以将它们存储在数据库中的某个位置。
这是一个使用Hibernate的脏属性特性的sample code,可能会给你一些启发。
https://stackoverflow.com/questions/35345927
复制相似问题