无法驱逐Hibernate二级缓存的相关联系--ehcache

时间:2018-04-23 22:00:43

标签: hibernate ehcache

我正在使用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实体,我会得到异常“未知实体”。

如何驱逐关联类的实体?

1 个答案:

答案 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仍然需要从数据库中获取集合中的每个实体。