找不到复合键的属性

时间:2017-08-31 09:24:35

标签: hibernate hibernate-envers

我有以下实体:

@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:无法解析属性:myParent_id:org.acme.project.Child_AUD [从org.acme.project.Child_AUD e__中选择e__,其中e __。myParent_id =:myParent_id和e __。originalId.REV。 id =(&lt;删除内部查询&gt;)]

我使用了这段代码:

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看起来非常相似,但我根据其说法不知道应该做些什么。

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

1 个答案:

答案 0 :(得分:1)

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

根本问题是OneAuditedEntityQueryGenerator仅支持引用指向@IdClass但不支持@EmbeddedId的用例。

如果您不能等到5.2.11.Final的正式版本,您可以使用hibernate-envers的最新快照,或者您可以使用此commit自行集成代码更改。

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