Hibernate-查询缓存/第二级缓存无法通过包含子项目的值对象来工作
-
18-09-2019 - |
题
我一直在努力解决以下问题:
我有一个包含不同面板的值对象。每个面板都有一个字段列表。
映射:
<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 ..从Ctry_cd_id = ...在查询缓存区域中也是如此。
当我调用servlet时,似乎正在使用缓存,但第二次不使用。 如果我使用JMX检查缓存的内容,一切似乎都可以,但是当我测量对象访问时间时,似乎并不总是使用缓存。
欢呼Zoltan
解决方案
我认为您还需要缓存协会:
<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>
不隶属于 StackOverflow