2010-03-14 63 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