2017-08-31 39 views
0

我有以下实体:组合键找不到属性

@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 =(<去除内部查询>)

我用这个代码:

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在文档中看起来异常相似,但我不知道我应该怎么做根据它说什么。

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

+0

您是否在'MyParent'的'@ OneToMany'映射上尝试了@AuditMappedBy(mappedBy =“id.myParent”)'来查看这是否有助于影响Envers? – Naros

+0

@Naros是的,那么例外是:“@AuditMappedBy指向一个不存在的属性:org.acme.project.Child.id.myParent” –

回答

0

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

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

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

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