我有两个经过审计的实体 A 和 B。实体 A 拥有实体 B 的集合(注释为一对多关系)。将 A 的新实例插入数据库时,A 和 B 的所有行都处于同一修订版(假设为修订版 1)。然后,A 上有一个更新,仅影响实体 B 的实例。因此,更新后,实体 A 仍处于修订版 1,而 B 的实体处于修订版 2(包括审核表中的 MOD 条目) 。在修订版3中,实体A被删除。因为实体B的集合被@Cascade注解,所以属于A的实体B也会被删除。
在这种情况下,如何使用 Envers 创建审计查询来获取实体 A 的实例以及修订版 2 的更新实体 B?当我查询实体 A 的所有修订版时,我要么得到 A 的已删除实体,它不包含 B 的实体(修订版 3),要么得到修订版 1 的 A,它也包含修订版 1 的 B 实体。
使用 Hibernate 3.6,如果有帮助的话。
我通过在 A 实体的等效项上添加隐藏的 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();
}
}
}
这可确保每当将修订版本添加到 B 时,都会将修订版本添加到 A,即使它需要在许多实体中使用自定义代码。
在您的情况下,这将确保 A 的历史记录实际上包含 B 的修订。这样您只需要一个查询即可获取整个 A、B 图表的所有修订
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)