休眠Envers:一个集合属性检索一个实体的修改权(Hibernate Envers: Retrie

2019-07-28 22:38发布

我有两个被审计单位,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,有没有什么帮助。

Answer 1:

如果你在第2次修订读取实体A,你会得到正确的数据。

有没有办法目前得到修订,其中一个实体或相关实体改变列表(如您的情况 - REV 2只在B中的改变,而不是一个)。



Answer 2:

我通过我的等效你一个实体的加入一个隐藏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的所有修订,烧烤图



Answer 3:

在Hibernate中,我们可以通过指定懒惰控制孩子的加载。 所以,你需要下面的行添加到Hibernate的配置类定义它加载所有的协会都读/写的情况。

<cache usage="read-write"/>

如果标记CacheMode.REFRESH那么将写数据到第二级缓存。 不从二级缓存中读取。

如果你没有在你可以把懒,这将返回更新信息父时加载孩子的问题。



文章来源: Hibernate Envers: Retrieving the right revisions of an entity with a collection property