如何通过休眠envers审核一对一关系的两个表?

时间:2019-01-28 17:55:57

标签: java spring hibernate jpa hibernate-envers

所以我有两个实体类,订阅 MailDetail 。它们之间存在一对一的关系。 这是课程-

Subscription.class-

@Data
@Entity
@AllArgsConstructor
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
public class Subscription {

@Id
@GeneratedValue(strategy =`enter code here` GenerationType.SEQUENCE, generator = "subscription_subscription_id_seq")
@SequenceGenerator(initialValue = 1, allocationSize enter code here= 1, name = "subscription_subscription_id_seq", sequenceName = "subscription_subscription_id_seq")
@Column
private Long subscriptionId;

@Column
private String template;

@Column
private String fileFormat;

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "mail_id", referencedColumnName = "mail_id")
private MailDetail mailDetail;

}

MailDetail.class-

@Data
@Entity
@Audited
public class MailDetail {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "mail_detail_mail_id_seq")
    @SequenceGenerator(initialValue = 1, allocationSize = 1, name = "mail_detail_mail_id_seq", sequenceName = "mail_detail_mail_id_seq")
    @Column
    private Long mailId;

    @Column
    private String emailId;
}

因此,这将创建两个审核表, subscription_aud mail_detail_aud 。 mail_detail表中的创建/更新仅通过订阅存储库完成。因此,我的要求是,每当mail_details表的字段发生更改时,我都需要在subscription_aud中创建一个审核条目。或者基本上我希望将mail_detail表中的更改视为订阅表中的更改。

我正在使用休眠Envers进行审核。我该如何实现?

1 个答案:

答案 0 :(得分:1)

不幸的是,目前的Envers并非如此。

任何多对多关联,或者其内容被修改或集合中的元素被更改,将默认传播该关系拥有方的审核更改;但是,甚至可以通过将org.hibernate.envers.revision_on_collection_change设置为 false 来禁用它。禁用此配置设置后,只有元素集合会将更改传播给所有者,因为此类集合中的元素不是实体,因此只能通过拥有的实体进行查询。

对于一对一关联,这是一个完全不同的故事。

完成所需操作的唯一方法是在拥有Subscription的{​​{1}}实例上引入一些列,并在此用例发生时更改该列的值。基于您仅通过聚合根MailDetail修改MailDetail的事实,这应该可以工作,但是我同意它不理想。