2013-04-30 76 views
3

我需要审计我的一些数据库表上的所有更改。例如,对于给定的员工,我需要知道所有地址以及该字段被修改的日期。其实我使用Spring Data,Hibernate和JPA。一个好的选择是使用休眠Envers,但问题是我无法使用Spring Data获取历史记录。另一种选择是创建一个Employee_history表,但我没有办法从两个不同的表中获取Employee记录(我想在Employee表中插入,但从Employee和Employee_history中获取数据)。有没有其他方法可以实现这一点?审计数据库记录随着Spring数据的变化

回答

3

您必须回答的第一个问题应该是您需要的审核级别。是一个简单的更改列表足够了吗?字符串表示是否足够好?或者你是否希望能够支持你的实体的修订,在那里你可以返回并获取修订版X的数据“没有任何麻烦”?

如果更改的列表足够了,并且您仍然使用休眠模式,那么我会选择HibernateEventListener(而不是JPA),因为您已经获得了postevents中的所有更改。无需自己创建三角洲。

另一方面,Envers很容易集成和配置。使用@Audited注释您的实体足以满足“完整”版本支持。我相信你不能直接使用Spring Data来查询修订实体,因为你总是可以编写你的AuditReaderRepository bean并直接使用hibernate审计查询接口。在这种情况下摆弄两个版本之间的更改列表将留给您,这基本上意味着获取修订版本并确定它们之间的增量。在这种情况下,Envers的主要优势在于用户表示仍然是用户类,而不仅仅是一个字符串(创建者fe)

它取决于您希望支持哪种级别的审计,我会用最小的所需实现。关于在www中选择什么样的审计策略,有一些很好的博客。

+0

我的应用支持数据每天都会刷新,但另一部分需要知道实体某些字段中发生的所有更改。然后,我必须向他们展示,以便能够使用我的实体并接收Employees的实例,而不是字符串。这就是为什么Envers对我来说真的很棒,但我在配置时遇到问题。 – 2013-05-01 12:41:27

+0

配置有什么问题?我所要做的就是将envers jar添加到战争中,并在我想要审计的类上添加@audited注释。我遇到的唯一的小问题是entityrelations没有被审计的实体,但是我只是在关系定义上添加了另一个注释来不审计这些(@auditmode?不确定atm)。 envers正在为我工​​作。我使用最新的休眠4.2 – 2013-05-02 05:00:52

6

使用Spring数据Envers :)

“这个项目是Spring数据JPA项目,以允许访问由Hibernate Envers管理实体版本的延伸。”

https://github.com/SpringSource/spring-data-envers

+0

请参阅Spring Data Envers路线图https://github.com/spring-projects/spring-data-envers/issues/33 – 2015-06-04 14:50:56

+0

FYI Envers内置于Spring数据截至发行列车跳跃者https: //spring.io/blog/2016/02/12/spring-data-release-train-hopper-m1-released – 2016-03-10 06:38:04