我正在使用Hibernate和Envers,4.3.6 FINAL。我已经使用注释设置了审计,并且在我在应用程序中保存信息时,我的所有审计表都已创建并正在正确填充。我的一个经审计的实体有一个映射表到其他实体,具有@ManyToMany配置。
雇主 - >标号
雇主可以拥有0到n个与之相关的指定实体。映射表是标准的,只有两列,Employers表的外键和Designations表的外键。 Envers为此映射表创建了一个审计表,并且相应地记录了记录,并在编辑雇主时使用与雇主相同的REV输入插入或删除。
我现在要做的是从数据库中检索审核信息,以便我可以将其用于报告目的。检索我的雇主的修订列表正在运行,并且给定修订的雇主状态是准确的。我无法弄清楚的是如何检索映射表的审核。我没有这些配对的实际实体。它们使用javax.persistence.JoinTable注释放在一起。因此,我的REVCHANGES表中的实体没有记录(我将org.hibernate.envers.track_entities_changed_in_revision设置为true)。查看数据库,有我的EmployerDesignations映射表和相应的EmployerDesignations_AUD审计表的记录,但我不知道如何检索这些审计记录,也不知道如何知道它们何时被更改为给定的修订。 / p>
如何检索映射表的审核历史记录?
雇主类:
@Entity
@DynamicInsert
@DynamicUpdate
@SelectBeforeUpdate
@Table(name="EMPLOYERS")
@Audited
public class Employer implements Serializable {
//All other fields omitted for brevity
...
private List<Designations> designations;
@ManyToMany
@JoinTable(name = "EMPLOYERDESIGNATIONS",
joinColumns = { @JoinColumn(name = "FK_EMPLOYER", nullable = false) },
inverseJoinColumns = { @JoinColumn(name = "FK_DESIGNATION", nullable = false) })
public List<Designations> getDesignations() {
return designations;
}
public void setDesignations(List<Designations> designations) {
this.designations= designations;
}
}
指定课程:
@Entity
@DynamicInsert
@DynamicUpdate
@SelectBeforeUpdate
@Table(name="DESIGNATIONS")
@Audited
public class Designation implements Serializable {
//All other fields omitted for brevity
...
private List<Employer> employers;
@ManyToMany
@JoinTable(name = "EMPLOYERDESIGNATIONS",
joinColumns = { @JoinColumn(name = "FK_DESIGNATION", nullable = false) },
inverseJoinColumns = { @JoinColumn(name = "FK_EMPLOYER", nullable = false) })
public List<Employer> getEmployers() {
return employers;
}
public void setEmployers(List<Employer> employers) {
this.employers= employers;
}
}
审计数据检索的测试代码:
List<Number> revisions = reader.getRevisions(Employer.class, employerId);
System.out.println(revisions);
for (Number revisionNum : revisions) {
Employer employer = reader.find(Employer.class, employerId, revisionNum);
System.out.println(employer);
}
答案 0 :(得分:1)
您需要做的就是检索Employer
实例,然后只需访问关联的getter以及审核实体时关联的状态将自动生效。
如果我们假设Envers环境中的第一个操作是您创建Employer
并通过您的连接将其与两个Designation
实体相关联,那么当您获取Employer
实例进行修订时1,该集合将有两个元素。
稍后在事务2中,您修改Employer
并删除一个Designation
并向该实体添加新的Designation
,然后在修订时获取Employer
2,它仍然包含两个Designation
实体实例,但这些实例将是第一个修订版中保留的实例,第二个版本是第二个修订版的一部分。