不审核OneToMany关系的缺点是什么?

时间:2013-03-14 21:06:27

标签: java hibernate jpa hibernate-envers auditing

我正在使用Hibernate Envers记录对数据库的所有更改。我注意到,当我添加一个与另一个实体具有ManyToOne关系的实体时,也在一侧实体上进行了修订。外键位于关系的许多方面,因此当在多方面添加实体时,映射一侧的实体不会更新。但是,在映射的一侧仍然为实体插入了修订版。

我使用此处建议的方法禁用了对OneToMany映射的审核: Whats the difference between @NotAudited and RelationTargetAuditMode.NOT_AUDITED in Hibernate EnVers?

现在这个答案表明,当我检索关系时,它将始终返回当前实体。这是否意味着我无法在旧版本的映射的一面获取信息?

我现在不确定如何查询审计日志,但从表结构来看,我似乎可以在任何时间点获取实体的当前状态。

假设我选择不审核OneToMany映射,下面的表结构会发生什么?

审核OneSideEntity 修订版1的OneSideEntity 修订版5的OneSideEntity

审核ManySideEntity1 版本2中的ManySideEntity1 修订版3中的ManySideEntity1 版本4的ManySideEntity1

审核ManySideEntity2 ManySideEntity2修订版6 版本7的ManySideEntity2 ManySideEntity2在第8版 ManySideEntity2修订版9

ManySideEntity对象都指向OneSideEntity。

当我在第5版 - [ManySideEntity1]或[ManySideEntity1,ManySideEntity2]查询一对多映射时,我将获得哪些实体。

上述问题表明我会得到后者,但在修订版5中我更喜欢第一个。我在这里错过了什么吗?

同样对于给定的时间戳,我想我可以找到小于该时间戳的所有修订版。这可以确保我在AUDITING日志中有准确的表信息。如果答案是[ManySideEntity1,ManySideEntity2],为什么会丢失信息?

1 个答案:

答案 0 :(得分:3)

也许您想将org.hibernate.envers.revision_on_collection_change设为false? (见http://docs.jboss.org/hibernate/core/4.1/devguide/en-US/html/ch15.html#d5e3937

在双向一对多关系中改变关系的一侧是否改变双方是有争议的并且取决于用例。在DB中,没有变化,但另一方面Java对象发生了变化(集合中有一个新元素)。