2016-08-30 34 views
2

將Hibernate從3.3.2.GA升級到4.3.11.Final時,我在查詢審計表時遇到了「EntityNotFoundException」。Hibernate Envers:在ManyToOne關係中找不到實體

我的模型:

@Entity 
@Audited 
public class A { 
    [...] 
    @ManyToOne 
    @JoinColumn(name = "B_ID", nullable = false) 
    private EntityB entityB; 
    [...] 
} 

@Entity 
@Audited 
public class B { 
    [...] 
} 

,當我在數據庫中查詢審覈表(SQLServer的),我看到了我的異常的原因。

select * from A_AUD where id = 1 => 1 result with VER_REV = 100 (and B_ID = 10) 
select * from B_AUD where id = 10 => 2 results with VER_REV = 200 and 300 

當我試着使用JPA加載:

getAuditReader(anEntityManager).createQuery().forRevisionsOfEntity(A.class false, true).add(AuditEntity.id().eq(1)); 

Hibernate是懶加載B_AUD。但在查詢中,他正在檢查VER_REV < = 100. 並且找不到結果。

這是我的數據沒有檢查休眠3的問題嗎? 或者這可以在代碼中解決?

我發現了一些像這樣的答案元素,但是我找不到這個問題的「良好做法」。 更新數據庫中的VER_REV可能會影響其他實體(我的模型有點複雜)。並且「修補」Envers必須是最後的解決方案。

在此先感謝您的答案。

+0

你可以包括你使用Hibernate Envers特定的引導配置嗎?你還可以在你的文章中包含來自'EntityB'一側的精確映射嗎? – Naros

回答

0

這是我的數據沒有檢查休眠3的問題嗎?或者這可以在代碼中解決?

這不一定是代碼問題或數據問題。

你提到極易發生的情況時,實體A被修改,但修改不會影響實體B的狀態,因此第一個版本不僅會導致實體A有保存修訂紀錄,例如VER_REV = 100

後來在將來某個時間點,兩個發生改變,改變實體B但很像前一種情況,這些變化不會影響實體A,因此爲什麼這些實體B變化有VER_REV = 200和VER_REV = 300.

我添加了一條評論,並可以更新此答案與更具體的細節,一旦我更瞭解您的配置&映射。

相關問題