属性 的复合键未找到

Property of Composite Key Not Found

我有以下实体:

@Entity @Table @Audited
public class MyParent {

    @Id
    @Column
    Integer id;
    @OneToMany(mappedBy = "id.myParent", orphanRemoval = true)
    @Cascade({ CascadeType.ALL })
    List<Child> children;
}

@Entity @Table @Audited
public class Child {

    @EmbeddedId
    ChildId id = new ChildId();
}

@Embeddable
public class ChildId implements Serializable {

    @MapsId("my_parent")
    @JoinColumn(name = "my_parent_id") 
    @ManyToOne
    MyParent myParent;
    @Column
    String name;
}

在我添加注释 @Audited 之前一切正常。之后一切都失败了,因为 Hibernate 5.1 不喜欢复合键(参见 HHH-7625)。

花了很长时间,但我刚刚成功更新到 5.2,现在一切正常...除了审计。我收到以下异常:

org.hibernate.QueryException: could not resolve property: myParent_id of: org.acme.project.Child_AUD [select e__ from org.acme.project.Child_AUD e__ where e__.myParent_id = :myParent_id and e__.originalId.REV.id = (<removed internal query>)]

我使用了这个代码:

AuditReader auditReader = AuditReaderFactory.get(this.em);
MyParent parent = auditReader .find(MyParent.class, id, revision);
parent.getChildren(); // exception is here

那么 Envers 从哪里得到 myParent_id?我不确定。我试图将列 my_parent_id 重命名为该 ID,但它什么也没做。

我尝试用 ID 替换 ChildId.myParent,但这也无济于事。

This paragraph 在文档中看起来非常相似,但我不知道根据它所说的我应该做什么。

我错过了什么吗?或者这是另一个错误?我如何让代码工作?

经过进一步审查,这是一个报告为 HHH-11770 的已知问题,此问题已得到修复并包含在 5.2 中。11.Final Hibernate Envers 版本。

潜在的问题是 OneAuditedEntityQueryGenerator 只支持引用指向 @IdClass 但不支持 @EmbeddedId.

的用例

如果您等不及 5.2 的正式发布,您可以使用 hibernate-envers 的最新快照。11.Final 或者您可以使用此 commit 自行集成代码更改。

如果您决定使用最新的快照,我建议您也将快照应用于 ORM。