所以我有两个实体类,Subscription和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表中的创建/更新仅通过Subscription存储库完成。所以我的要求是每当mail_details表的字段发生变化时,我都需要在subscription_aud中有一个审计条目。或者基本上我想要将mail_detail表中的更改视为订阅表中的更改。
我正在使用hibernate envers进行审计。我怎样才能实现这一目标?
不幸的是,不是Envers目前的设计方式。
无论是修改了内容还是更改了集合中的元素,任何多对多关联都将默认传播关系所属方的审计更改;但是,甚至可以通过将org.hibernate.envers.revision_on_collection_change
设置为false来禁用它。禁用此配置设置时,只有元素集合会将更改传播给所有者,因为此类集合中的元素不是实体,因此只能通过拥有实体进行查询。
对于一对一的关联,这是一个完全不同的故事。
实现所需内容的唯一方法是在拥有Subscription
的MailDetail
实例上引入一些列,并在此用例发生时更改该列的值。基于你只通过聚合根MailDetail
修改Subscription
的事实,这应该有效,但我同意它不太理想。