【发布时间】:2017-10-09 11:33:03
【问题描述】:
我正在使用带有 Envers 的 Hibernate,4.3.6 FINAL。我已经使用注释设置了审计,并且当我在应用程序中保存信息时,我的所有审计表都已创建并正确填充。我的一个审计实体有一个到其他实体的映射表,配置为 @ManyToMany。
雇主 -> 职务
雇主可以有 0 到 n 个与之关联的指定实体。映射表是标准的,只有两列,一个是 Employers 表的外键,一个是 Designations 表的外键。 Envers 为这个映射表创建了一个审计表,并且记录被适当地记录,当编辑 Employer 时,插入或删除输入的 REV 与 Employer 相同。
我现在要做的是从数据库中检索审计信息,以便将其呈现以用于报告目的。正在检索我的雇主的修订列表,并且给定修订的雇主状态是准确的。我无法弄清楚的是如何检索映射表的审计。我没有这些配对的实际实体。它们使用 javax.persistence.JoinTable 注释放在一起。因此,我的 REVCHANGES 表中没有实体记录(我将 org.hibernate.envers.track_entities_changed_in_revision 设置为 true)。查看数据库,有我的 EmployerDesignations 映射表和相应的 EmployerDesignations_AUD 审计表的记录,但我不知道如何检索这些审计记录,也不知道它们何时已针对给定的修订进行了更改。
如何检索映射表的审计历史记录?
雇主类别:
@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);
}
【问题讨论】:
标签: java hibernate-envers