【问题标题】:Hibernate - EhCache - Which region to Cache associations/sets/collections?Hibernate - EhCache - 哪个区域缓存关联/集合/集合?
【发布时间】:2011-01-27 08:13:01
【问题描述】:

我是hibernate的新手。如果有人可以评论我的以下查询,那就太好了:

假设我有一个父类,每个父类都有多个孩子。所以父类的映射文件应该是这样的:

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 更有意义,但我不知道在哪种情况下应该使用单独的缓存区域进行关联/集合/集合,如上述情况。请提供您的意见,如果我的问题不清楚,请告诉我。

谢谢大家。

【问题讨论】:

    标签: java hibernate orm caching ehcache


    【解决方案1】:

    所以对于设置的孩子,我们应该指定应该缓存关联的区域 org.demo.parent.children 还是应该使用 org.demo.children 的缓存区域来缓存孩子。

    默认情况下,可选的 region 设置为类或集合角色名称。因此对于set,默认区域名称为"org.demo.Parent.children"(即与Child 的默认区域名称"org.demo.Child" 不同)。 这是有道理的 IMO,因为您希望能够在不使集合类型中的 所有实体 无效的情况下使 特定集合或区域中的所有集合 无效。

    但实际上,这里最大的问题是:为什么不使用默认值?您正在引入额外的工作、维护和潜在的问题来源,我无法理解这些好处。作为约定优于配置的粉丝,我使用默认值(即我没有设置region)。

    【讨论】:

    • 感谢您的回复。 “这是有道理的 IMO,因为您希望能够使特定集合或区域中的所有集合无效,而不会使集合类型中的所有实体无效。”你的意思是在上面的缓存配置中说有两个不同的缓存儿童地区是有利的。没看懂怎么弄??请详细说明。一致性怎么样。如果其中一个区域 (org.demo.parent.children) 得到更新,则另一个子缓存区域 (org.demo.children) 不会反映更改。这是否会导致不一致请澄清。
    • @lifeisnotfair 我不确定你会得到什么。首先,您是否同意可以通过添加/删除元素来修改集合而不修改元素本身?我在这里看不到任何不一致的来源。其次,Hibernate 为您处理缓存/区域,因此您不必担心。这是使用默认值的另一个原因(尤其是如果您是 Hibernate 的新手),而不是尝试过早地(并且可能是错误地)优化一些不成问题的东西。如果您想微调,请稍后再做。
    猜你喜欢
    • 2013-11-07
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    相关资源
    最近更新 更多