【问题标题】:Hibernate - query caching/second level cache does not work by value object containing subitemsHibernate - 查询缓存/二级缓存不适用于包含子项的值对象
【发布时间】:2011-01-13 04:10:39
【问题描述】:

我一直在努力解决以下问题:
我有一个包含不同面板的值对象。每个面板都有一个字段列表。

映射:

<class name="com.aviseurope.core.application.RACountryPanels" table="CTRY" schema="DBDEV1A" where="PEARL_CTRY='Y'" lazy="join">
<cache usage="read-only"/>
<id name="ctryCode">
<column name="CTRY_CD_ID" sql-type="VARCHAR2(2)" not-null="true"/>
</id>
<bag name="panelPE" table="RA_COUNTRY_MAPPING" fetch="join" where="MANDATORY_FLAG!='N'">
<key column="COUNTRY_LOCATION_ID"/>
<many-to-many class="com.aviseurope.core.application.RAFieldVO" column="RA_FIELD_MID" where="PANEL_ID='PE'"/>
</bag>
</class>

我使用以下标准来获取值对象:

Session m_Session = HibernateUtil.currentSession();
            m_Criteria = m_Session.createCriteria(RACountryPanels.class);
            m_Criteria.add(Expression.eq("ctryCode", p_Country));
            m_Criteria.setCacheable(true);

正如我所见,查询缓存仅包含主选择,例如

select * from CTRY where ctry_cd_id=?

RACountryPanels 和 RAFieldVO 都是二级缓存。 如果我检查二级缓存内容,我可以看到它也包含 RAFields 和 RACountryPanels,并且我可以在查询缓存区域中看到 select .. from CTRY where ctry_cd_id=...。

当我调用 servlet 时,它似乎正在使用缓存,但第二次没有。 如果我使用 JMX 检查缓存的内容,似乎一切正常,但是当我测量对象访问时间时,它似乎并不总是使用缓存。

干杯 佐尔坦

【问题讨论】:

    标签: hibernate orm collections second-level-cache query-cache


    【解决方案1】:

    我认为您还需要缓存关联:

    <bag name="panelPE" table="RA_COUNTRY_MAPPING" fetch="join" where="MANDATORY_FLAG!='N'">
    
      <cache usage="read-write"/>
    
      <key column="COUNTRY_LOCATION_ID"/>
      <many-to-many class="com.aviseurope.core.application.RAFieldVO" column="RA_FIELD_MID" where="PANEL_ID='PE'"/>
    </bag>
    

    【讨论】:

    • @hamoriz 如果可以,请尝试提供更多详细信息(例如您在请求之前和之后使用 JMX 看到的内容等)。
    • RA_FIELD映射还有其他问题,修复后,您的建议解决了问题
    • @hamoritz 很高兴知道它很有用。
    猜你喜欢
    • 2014-11-28
    • 2011-12-18
    • 1970-01-01
    • 2013-11-23
    • 2013-10-31
    • 1970-01-01
    • 2015-05-14
    • 2017-03-06
    • 2014-06-28
    相关资源
    最近更新 更多