我正在使用Hibernate 4.17并使用ehcache作为二级缓存。在hbm文件的定义中,我在类级别声明了缓存。
<class name="com.test.Program" table="program" mutable="false">
<cache usage="nonstrict-read-write" />
....
我将1对多关联定义如下
<list name="parameters" cascade="none" batch-size="100">
<cache usage="nonstrict-read-write" />
<key column="program_oid"/>
<index column="sequence" />
<one-to-many class="com.test.ProgramParameter"/>
</list>
我有一个为主类定义的区域 - 在ehcache.xml中的Program。问题是每当我使用
逐出二级缓存时HibernateUtil.getSessionFactory().getCache().evictEntityRegion("com.test.Program");
com.test.Program 的所有实体都被逐出,但不是 com.test.Program.parameters 此外,如果我试图驱逐上面的com.test.Program.parameters实体,我会得到异常“未知实体”。
如何驱逐关联类的实体?
答案 0 :(得分:2)
尝试:
HibernateUtil.getSessionFactory().getCache().evictCollectionRegion("com.test.Program.parameters");
parameters
列表上的缓存设置将使用父程序实体的标识符作为密钥,仅在单独的collection cache中存储该列表中的实体的标识符。
ProgramParameter
实体本身不会被缓存,除非您在该实体上有相应的缓存设置,例如
<class name="com.test.ProgramParameter" table="program_parameter" mutable="false">
<cache usage="nonstrict-read-write" />
....
每当你使用集合缓存时,你也应该缓存实体,否则Hibernate仍然需要从数据库中获取集合中的每个实体。