2012-02-23 81 views
0

在第二級緩存的解釋上Nhibernate二級緩存不適用於級聯關聯嗎?

http://knol.google.com/k/nhibernate-chapter-16-improving-performance#16(2E)3(2E)(C2)(A0)Managing_the_caches

它說:如果關聯與級聯=「全」或級聯=「全刪除,孤兒」映射的NHibernate會自動驅逐相關實體。

爲什麼我會希望nhibernate在級聯存在時驅逐高速緩存的關聯?

這是否意味着我必須更改關聯映射以使nhibernate第二級實際工作?

回答

1

以這種方式工作是件好事。緩存很棒,但它必須在安全的一方出錯,以儘可能防止無效的緩存數據。

想想帶有標題和訂單項的發票的概念。標題設置爲級聯所有插入/更新/刪除到訂單項。因此,如果您刪除標題,訂單項也會被刪除。這是有道理的,因爲這構成了一個「聚合實體」,頭部是聚合根。這些訂單項沒有自己的真實身份。如果您保存了新的標題,則還需要保存任何添加的訂單項。級聯是偉大的,它爲你處理這個。

同樣,從緩存的角度來看,如果標題已更改並因此從緩存中刷新,則所有行項目也應該刷新,因爲級聯可能會影響其中的一個或多個行項目。如果您正在從數據庫重新加載聚合根目錄,則還應該重新加載其子目錄。

基本上,如果聚合根已更改,則無法保證高速緩存中子項的狀態,因此您必須期望它們也可能已更改。

我還應該補充一點,你應該仔細考慮你想要緩存什麼。如果你正在緩存經歷不斷變化的實體,它可能無益於你。通常你會緩存相對靜態的東西,所以級聯不是什麼大問題。

+0

好的,這是可以理解的。但是在我們的場景中,似乎關聯從第二級緩存刷新,而根聚合未被應用程序更改。 – Hace 2012-02-24 06:42:18

+0

沒有足夠的信息給你答案。是什麼讓你相信他們被驅逐?你確定他們被緩存了嗎?你有沒有試過Nhprof來看看實際發生了什麼? – swannee 2012-02-24 12:15:38

+0

你也可以發佈你的映射? – swannee 2012-02-24 14:02:39