即使没有更改,Hibernate Envers也会审核oneToMany方面

时间:2019-06-10 10:02:41

标签: java hibernate hibernate-envers

具有两个实体InstrumentDefinition

instrumentCode更改后,Envers仅为Instrument创建审核记录。

我希望在instrumentCode更改后,Envers为InstrumentDefinition实体创建审核记录。怎么可能,有可能吗?

我玩过@ AuditedJoinTable,@ AuditedMappedBy,但是没有运气。

@Audited
@Getter
@Entity
public class Instrument {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(name = "instrument_code")
    protected String instrumentCode;

    @ManyToOne(optional = false, fetch = FetchType.LAZY, targetEntity = Definition.class)
    @JoinColumn(name = "definition_id", nullable = false)
    private Definition definition;
}
//-----
@Audited
@Getter
@Entity
public class Definition {

    @Id
    @Column(nullable = false)
    protected String id;

    @OneToMany(mappedBy = "definition",
            orphanRemoval = true,
            cascade = CascadeType.ALL,
            targetEntity = Instrument.class)
    private Set<Instrument> instruments = Sets.newHashSet();
}

1 个答案:

答案 0 :(得分:1)

我不知道目前是否有任何可用的现成可用配置(尽管似乎类似is being developed)。

获取历史记录以使数据库中的审核记录完全规范化时,可能可以通过audit queries手动将两者的修订合并在一起。

或者您可以在父实体中引入一个虚拟列,并在子项更改时对其进行更新,如this answer所示:

@Entity
public class A {
    private Date lastModified;

    @OneToMany(mappedBy = "a", cascade = CascadeType.ALL)
    private List<B> blist;

    public void touch() {
        lastModified = new Date();
    }
}

public class B {
    @ManyToOne
    private A a; 

    @PreUpdate
    public void ensureParentUpdated() {
        if (a != null) {
            a.touch();
        }
    }
}