2017-08-31 40 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應用快照。