2010-03-14 65 views
1

我是冬眠的新手。如果有人可以對以下查詢發表評論,那將是非常好的:Hibernate - EhCache - 緩存關聯/集合/集合的哪個區域?

假設我有一個父類,並且每個父類有多個孩子。因此,父類的映射文件將是這樣的:

parent.hbm.xml

<hibernate-mapping > 
<class name="org.demo.parent" table="parent" lazy="true"> 
<cache usage="read-write" region="org.demo.parent"/> 
<id name="id" column="id" type="integer" length="10"> 
<generator class="native"> 
</generator> 
</id> 
<property name="name" column="name" type="string" length="50"/> 

<set name="children" lazy="true"> 
<cache usage="read-write" region="org.demo.parent.children" /> 
<key column="parent_id"/> 
<one-to-many class="org.demo.children"/> 
</set> 

</class> 
</hibernate-mapping> 

children.hbm.xml

<hibernate-mapping > 
<class name="org.demo.children" table="children" lazy="true"> 
<cache usage="read-write" region="org.demo.children"/> 
<id name="id" column="id" type="integer" length="10"> 
<generator class="native"> 
</generator> 
</id> 

<property name="name" column="name" type="string" length="50"/> 

<many-to-one name="parent_id" column="parent_id" type="integer" length="10" not-null="true"/> 

</class> 
</hibernate-mapping> 

所以對於一套兒童,應我們指定應該緩存關聯的區域org.demo.parent.children,或者我們是否應該使用org.demo.children的緩存區域來緩存子進程。

我使用EHCache作爲二級緩存提供程序。我試圖尋找這個問題的答案,但無法在這個方向找到任何答案。使用org.demo.children更有意義,但我不知道在哪種情況下,應該像上述情況那樣爲關聯/集合/集合使用單獨的緩存區域。請提供您的意見也讓我知道如果我不清楚我的問題。

謝謝大家。

回答

2

所以對於一套兒童,我們應該指定區域org.demo.parent.children它應該緩存關聯或者我們應該用在孩子們會得到緩存org.demo.children的緩存區域。

默認情況下,可選region設置爲類或者集合角色名稱。因此,對於set,默認區域名稱將爲"org.demo.Parent.children"(即與Child的默認區域名稱不同,其將爲"org.demo.Child")。 這是有道理的國際海事組織,因爲你想能夠使無效一個特定的集合或一個區域中的所有集合所有的實體從一個集合的類型。

但實際上,這裏最大的問題是:爲什麼你不使用默認值?您正在引入額外的工作,維護和潛在的問題來源,並且我無法理解其優點。作爲慣例超過配置的粉絲,我使用默認值(即我不設置region)。

+0

感謝您的回覆。 「 」這很有道理,因爲您希望能夠使某個特定集合或某個區域中的所有集合無效而不會使集合類型中的所有實體無效。「 您是否打算在上述緩存配置中說爲兒童提供兩個不同的緩存區域是有利的。我不明白怎麼樣?善意地闡述。 一致性如何?如果其中一個區域(org.demo.parent.children)得到更新,則其他的子區域(org.demo.children)不會反映該更改。這不會造成不一致性 請澄清。 – user293297 2010-03-14 16:59:42

+0

@lifeisnotfair我不確定能否幫到你。首先,你是否同意你可以通過添加/刪除元素來修改一個集合而不用修改元素本身?我在這裏看不到任何不一致的來源。其次,Hibernate爲你處理緩存/區域,所以你不必擔心它。這是使用默認值的另一個原因(特別是如果你是Hibernate的新手),而不是嘗試過早地(也可能是錯誤地)優化某些不成問題的東西。如果你想微調,稍後再做。 – 2010-03-15 00:23:31