2012-06-15 114 views
1

我使用ehcache和hibernate 3.6.7最後。這是一個顯示緩存問題的僞代碼示例。奇怪的休眠緩存行爲

@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 
public class A{  

    long id;  

    @OneToMany(mappedBy = "aId", targetEntity = B.class, fetch = FetchType.LAZY) 
    @Fetch(value = FetchMode.JOIN) 
    @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 
    protected Set<B> fieldB; 
}  


@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 
public class B { 

    long id; 

    long bId; 
} 

1)第一次當我從休眠載入實體A時,它不讀取fieldB。這是好的 - 因爲FetchType.LAZY被設置。

2)當我加載實體A I看到的SQL查詢檢索實體的第二時間JOIN實體B.

3)如果除去@Fetch(值= FetchMode.JOIN)語句點2將不執行。

所以問題是這個錯誤或功能?我怎樣才能避免這種潛在的事情。

+0

你也可以試着問一下Hibernate論壇。如果你足夠勇敢(並且有時間),使用Hibernate源代碼進行調試。 – Luciano

回答

1

您有兩個衝突的提取,您肯定不希望在列和@Fetch註釋中指定提取,因爲它會提供不可預測的行爲。