首页 > 解决方案 > Hibernate Envers 多对多变化检测

问题描述

我有具有单向多对多关系的实体。一个文档可以与多个设施和多个楼层相关联。如果更新了文档,则与文档相关的设施和楼层应在修改集合时在 envers 中创建新的修订。不幸的是,这不会发生。问题是如何将子实体(文档)中的更改传播到多对多关系(设施、楼层)的拥有方?

使用过的库的相关资料:

@Entity
@Table(name = "facility")
@Audited(targetAuditMode = RelationTargetAuditMode.AUDITED)
public class Facility extends AbstractAuditingEntity implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    // more attributes

    @ManyToMany
    @JoinTable(name = "facility_documents",
        joinColumns = @JoinColumn(name = "facilities_id", referencedColumnName = "id"),
        inverseJoinColumns = @JoinColumn(name = "documents_id", referencedColumnName = "id"))
    @Audited(targetAuditMode = AUDITED)
    private Set<Document> documents = new HashSet<>();

    // getter + setter
}
@Entity
@Table(name = "floor")
@Audited(targetAuditMode = RelationTargetAuditMode.AUDITED)
public class Floor extends AbstractAuditingEntity implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    // more attributes

    @ManyToMany
    @JoinTable(name = "floor_documents",
        joinColumns = @JoinColumn(name = "floors_id", referencedColumnName = "id"),
        inverseJoinColumns = @JoinColumn(name = "documents_id", referencedColumnName = "id"))
    @NotAudited
    private Set<Document> documents = new HashSet<>();

}
@Entity
@Table(name = "document")
@Audited(targetAuditMode = RelationTargetAuditMode.AUDITED)
public class Document extends AbstractAuditingEntity implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    // more attributes, getters and setters but no ManyToMany Mapping to facility and floor

}

以下 envers 审计表条目是使用以下过程编写的:

1.状态:创建设施+文档,通过添加文档来更新设施

在此处输入图像描述

2. 状态:删除文件

在此处输入图像描述 预期:为设施创建新修订 实际:未为设施创建修订

3. 状态:手动更新设施

在此处输入图像描述

如果我现在获取设施的当前变更日志,则该文档不再在修订版中,并被标记为从设施中删除。此更新应通过更改文档自动发生。

标签: hibernatehibernate-envers

解决方案


推荐阅读