我有两个被审计单位,A和B.实体A持有实体B(注释为一一对多的关系)的集合。 当插入的新实例到数据库中,A和B的所有行同一版本的(假设修订1)。 然后,对甲更新仅影响实体B的实例,以便在更新后,实体A仍处于修订版1,而B的实体是在版本2(包括在审计表MOD条目) 。 在修订3中,实体A被删除。 由于实体B的集合与@Cascade注释,属于实体B被删除。
鉴于这种情况,如何创建与Envers审计查询得到实体A的一个实例与更新实体版本2的B' 当我查询实体A的所有修订,我要么得到一个被删除的实体持有无B(修订版3)的实体,或者我拿到的修订1持有修订1说明B实体了。
使用Hibernate 3.6,有没有什么帮助。
如果你在第2次修订读取实体A,你会得到正确的数据。
有没有办法目前得到修订,其中一个实体或相关实体改变列表(如您的情况 - REV 2只在B中的改变,而不是一个)。
我通过我的等效你一个实体的加入一个隐藏LASTUPDATED日期字段解决了类似的问题。
@Entity
public class A {
private Date lastModified;
@OneToMany(mappedBy = "a", cascade = CascadeType.ALL )
private List<B> blist;
public void touch(){
lastModified=new Date();
}
}
然后在相关实体(如你B场),我增加了以下内容:
public class B {
@ManyToOne
private A a;
@PreUpdate
public void ensureParentUpdated(){
if(a!=null){
a.touch();
}
}
}
这确保了修订加入A每当增加了补正,即使它需要在许多实体的自定义代码到B点。
在你的情况,这将确保A的历史实际上包含B的修订这种方式,你只需要一个查询来获取整个A的所有修订,烧烤图
在Hibernate中,我们可以通过指定懒惰控制孩子的加载。 所以,你需要下面的行添加到Hibernate的配置类定义它加载所有的协会都读/写的情况。
<cache usage="read-write"/>
如果标记CacheMode.REFRESH那么将写数据到第二级缓存。 不从二级缓存中读取。
如果你没有在你可以把懒,这将返回更新信息父时加载孩子的问题。
文章来源: Hibernate Envers: Retrieving the right revisions of an entity with a collection property