检索映射表的修订版 - Hibernate Envers

时间:2017-05-10 17:13:58

标签: java hibernate-envers

我正在使用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);
}

1 个答案:

答案 0 :(得分:1)

您需要做的就是检索Employer实例,然后只需访问关联的getter以及审核实体时关联的状态将自动生效。

如果我们假设Envers环境中的第一个操作是您创建Employer并通过您的连接将其与两个Designation实体相关联,那么当您获取Employer实例进行修订时1,该集合将有两个元素。

稍后在事务2中,您修改Employer并删除一个Designation并向该实体添加新的Designation,然后在修订时获取Employer 2,它仍然包含两个Designation实体实例,但这些实例将是第一个修订版中保留的实例,第二个版本是第二个修订版的一部分。