hibernate-envers onetomany join类未经过审计,但需要审计连接列

时间:2017-09-28 21:14:48

标签: java hibernate join hibernate-envers

我正在尝试在审核表中保存连接列值,而不是审核连接表。

这是我的实体类。

审核类信息:

@Entity
@Audited
@Table(name = "INFO")
public class Info extends AbstractEntity {

    @Id
    @Column(name = "ID")
    private String id;

    /*More Columns */ 

    @ManyToOne
    @JoinColumns({ @JoinColumn(name = "FIRST_NAME", referencedColumnName = "FIRST_NAME"),
        @JoinColumn(name = "LAST_NAME", referencedColumnName = "LAST_NAME") })
    @NotAudited
    private Details details;


}

未审核类:详细信息:

@Entity
@Table(name = "DETAILS")
public class Details extends AbstractEntity {

    @EmbeddedId
    private DetailsPK detailsPK;
    /*More Columns */ 

}

主键/加入字段在此处定义:

@Embeddable
public class DetailsPK implements Serializable {

    @Column(name = "FIRST_NAME")
    private String firstName;

    @Column(name = "LAST_NAME")
    private String lastName;

}

这里,详细信息是静态的...它不会改变...因此,需要审核....但是,当审核INFO更改时,我希望INFO_AUD表同时捕获名字和最后一个名称姓名......有没有办法指定这个?

谢谢你, 乔。

1 个答案:

答案 0 :(得分:0)

由于您想要的字段是主键的一部分,因此您可以通过指定特殊的审计注释属性来轻松完成此操作:

@ManyToOne
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
private Details details;

简而言之,这指示Envers关联实体Details不是经审核的实体;但是,审计模式应该拍摄关联实体的主键列的快照。

因此,您应该希望Info_AUD有两列代表名为details_FIRST_NAMEdetails_LAST_NAME的名称值。

您不需要对数据模型做任何其他特殊操作,因为当您更改与Details关联的Info对象时,Envers将确保在历史记录中更新名称列相应地排快照。