Hibernate - 查询缓存/二级缓存不适用于包含子项的值对象

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

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

映射:

<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 检查缓存的内容,一切似乎都正常,但是当我测量对象访问时间时,它似乎并不总是使用缓存。

干杯 佐尔坦

最佳答案

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

<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>

关于Hibernate - 查询缓存/二级缓存不适用于包含子项的值对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2201457/

相关文章:

mysql - 将相似的实体存储在同一个表中与数据库中的多个表中

javascript - 未处理的拒绝类型错误 : sequalize

Java集合问题

c# - 集合查找;字典的替代品

mysql - Spring MVC Rest Web服务

java - 删除hibernate实体而不(尝试)删除关联表( View )条目

java - 如何在 JPA 的两列上运行像 SUM 这样的聚合函数并显示它们的结果?

c# - 计算十亿元素列表中唯一元素的最快方法是什么?

hibernate - Grails生成的 hibernate 定义

java - jpa/hibernate 查询返回的实体中包含的过滤器列表