我遇到了一个奇怪的Hibernate异常,我无法解释。它告诉我,我正在使用二级缓存,但在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>
任何想法会触发此异常?提前谢谢!
答案 0 :(得分:11)
Pau在hibernate.cache.region.factory_class Required in hibernate.cfg.xml上写道:
例外是不言自明的。你必须设置
hibernate.cache.region.factory_class
属性。例如,ehcache将添加以下行:<property name="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</property>
答案 1 :(得分:6)
使用以下行修复它:
<beans:entry key="hibernate.cache.use_second_level_cache" value="false"/>
但是Hibernate消息可能是一个警告,我们应该使用二级缓存?
答案 2 :(得分: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 {
如果其他人有类似的情况,我会发布帖子
答案 3 :(得分:0)
这个错误非常具有误导性,我花了将近一天的时间才弄清楚根本原因。以为我的hibernate配置文件已经定义了二级缓存和工厂类,它给了我一个错误,即没有给出hibernate.cache.region.factory_class。
我看到hibernate.cfg.xml文件在classpath中也可用。但即使在任何变化之后,也没有任何影响并得到同样的错误。
最后我意识到,出于测试目的,我已经覆盖了persistence.xml文件,该文件在persistence-unit下具有以下缺少的属性。添加后,该问题已得到解决。
<properties>
<property name="hibernate.ejb.cfgfile" value="hibernate.cfg.xml" />
</properties>
所以这意味着我的应用程序无法找到hibernate.cfg.xml文件,并且不管怎样而不是提供与缺少配置相关的错误,它都呼唤工厂类。
答案 4 :(得分: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>