11

我遇到了一个我无法解释的奇怪的休眠异常。它告诉我我正在使用二级缓存,但我没有在哪里hibernate.cfg.xml指定二级缓存。这是一个例外:

org.hibernate.cache.NoCacheRegionFactoryAvailableException: Second-level cache is used in the
application, but property hibernate.cache.region.factory_class is not given, please either
disable second level cache or set correct region factory class name to property
hibernate.cache.region.factory_class (and make sure the second level cache provider,
hibernate-infinispan, for example, is available in the classpath).
    at org.hibernate.cache.internal.NoCachingRegionFactory.buildEntityRegion(NoCachingRegionFactory.java:69)
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:348)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1769)
    at net.me.myapp.common.dao.SessionFactoryProvider.newSessionFactory(SessionFactoryProvider.java:37)
    at net.me.myapp.common.dao.BaseDAO.doPersist(BaseDAO.java:28)
    at net.me.myapp.common.dao.WordDAO.deleteAllWords(WordDAO.java:36)
    at net.me.myapp.tools.dmapper.DictionaryMapper.run(DictionaryMapper.java:88)
    at net.me.myapp.tools.dmapper.DictionaryMapper.main(DictionaryMapper.java:56)

我的hibernate.cfg.xml

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- DataSource & Connection info. -->
        <property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>
        <property name="hibernate.connection.driver.class">org.h2.Driver</property>
        <property name="hibernate.connection.url">jdbc:h2:file:/${MYAPP_HOME}/data/myapp</property>
        <property name="hibernate.connection.username">myapp</property>
        <property name="hibernate.connection.password">mypassword</property>
        <property name="hibernate.connection.pool_size">1</property>

        <!-- General Hibernate settings. -->
        <property name="show_sql">true</property>
        <property name="format_sql">true</property>
        <property name="use_sql_comments">true</property>

        <!-- DDL Mode. -->
        <property name="hbm2ddl.auto">validate</property>

        <!-- All our Hibernate mapping XML files. -->
        <mapping class="net.me.myapp.common.dto.WordDTO" />
    </session-factory>
</hibernate-configuration>

有什么想法会触发此异常吗?提前致谢!

4

5 回答 5

11

Pau在hibernate.cfg.xml 中的 hibernate.cache.region.factory_class上写道:

这个例外是不言自明的。您必须设置 hibernate.cache.region.factory_class属性。例如,使用 ehcache 将添加以下行:

<property name="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</property>
于 2013-10-11T07:44:12.753 回答
6

使用以下行修复它:

<beans:entry key="hibernate.cache.use_second_level_cache" value="false"/>

但是 Hibernate 消息可能是我们应该使用二级缓存的警告?

于 2014-10-16T13:29:44.247 回答
5

我也收到了这个错误并花了我一段时间来追踪。在某一时刻,我们将拥有多个缓存区域,但最终决定我们只拥有一个缓存池。

当我们将该更改合并到一个较旧的分支中时 - 我们仍然有一个具有每个实体缓存池的旧策略的实体:

@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region="tableRegion")
@Table(name = "table")
public class table {

通过删除 Cache 注释 - 它解决了 org.hibernate.cache.NoCacheRegionFactoryAvailableException:

@Entity
@Table(name = "table")
public class table {

想我会发帖以防其他人有类似情况

于 2016-02-01T14:51:18.370 回答
0

这些是您需要添加以启用二级缓存的属性

<!-- Provider for second level cache -->
        <property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
        <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
于 2018-06-05T12:19:59.763 回答
0

这个错误非常误导,我花了将近一天的时间才最终找出根本原因。以为我的休眠配置文件已经定义了二级缓存和工厂类,它给我的错误是 hibernate.cache.region.factory_class 没有给出。

我看到通过 hibernate.cfg.xml 文件在类路径中也可用。但即使在任何改变之后,也没有影响并且得到同样的错误。

最后我意识到,出于测试目的,我已经覆盖了persistence.xml 文件,该文件在persistence-unit 下缺少以下属性。添加后该问题已解决。

 <properties>
            <property name="hibernate.ejb.cfgfile" value="hibernate.cfg.xml" />
</properties>

所以这意味着我的应用程序无法找到 hibernate.cfg.xml 文件,并且以某种方式没有给出与缺少配置相关的错误,而是呼唤工厂类。

于 2018-01-11T05:32:54.390 回答