不审核 OneToMany 关系的缺点是啥?
Posted
技术标签:
【中文标题】不审核 OneToMany 关系的缺点是啥?【英文标题】:What is the disadvantage of not auditing OneToMany relations?不审核 OneToMany 关系的缺点是什么? 【发布时间】:2013-03-03 10:44:13 【问题描述】:我正在使用 Hibernate Envers 来记录对数据库的所有更改。我注意到,当我添加一个与另一个实体具有 ManyToOne 关系的实体时,也对一侧实体进行了修订。外键位于关系的多端,因此当在多端添加实体时,映射一侧的实体不会更新。但仍在为映射一侧的实体插入修订版。
我使用此处建议的方法禁用了 OneToMany 映射的审核: Whats the difference between @NotAudited and RelationTargetAuditMode.NOT_AUDITED in Hibernate EnVers?
现在这个答案表明,当我检索关系时,它总是会返回当前实体。这是否意味着我无法获得旧版本映射一侧的信息?
目前我不确定如何查询已审核的日志,但从表结构看来,我可以随时获取实体的当前状态。
假设我选择不审核 OneToMany 映射,那么下面的表结构会发生什么?
审核 OneSideEntity OneSideEntity 在修订版 1 修订版 5 中的 OneSideEntity
对 ManySideEntity1 的审核 修订版 2 中的 ManySideEntity1 修订版 3 中的 ManySideEntity1 修订版 4 中的 ManySideEntity1
对 ManySideEntity2 的审核 修订版 6 中的 ManySideEntity2 修订版 7 中的 ManySideEntity2 修订版 8 中的 ManySideEntity2 修订版 9 中的 ManySideEntity2
ManySideEntity 对象都指向 OneSideEntity。
当我在修订版 5 - [ManySideEntity1] 或 [ManySideEntity1, ManySideEntity2] 查询一对多映射时,我将获得哪些实体。
上述问题表明我会得到后者,但在修订版 5 中我更喜欢第一个。我在这里遗漏了什么吗?
此外,对于给定的时间戳,我想我可以找到小于该时间戳的所有修订。这可以确保我在 AUDITING 日志中有准确的表信息。如果答案是 [ManySideEntity1, ManySideEntity2] 为什么会丢失信息?
【问题讨论】:
【参考方案1】:也许您想将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 对象发生了变化(集合中有一个新元素)。
【讨论】:
以上是关于不审核 OneToMany 关系的缺点是啥?的主要内容,如果未能解决你的问题,请参考以下文章