Hibernate NoCacheRegionFactoryAvailableException

Я получаю странное исключение 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>

Любые идеи, что могло бы вызвать это исключение? Спасибо заранее!

Ответ 1

Pau написал на hibernate.cache.region.factory_class Обязательно в hibernate.cfg.xml

Исключение вполне понятно. Вы должны установить hibernate.cache.region.factory_class. Например, с ehcache будет добавлена ​​следующая строка:

<property name="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</property>

Ответ 2

Используя следующую строку, зафиксируйте ее:

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

Но сообщение Hibernate, вероятно, является предупреждением о том, что мы должны использовать кеш второго уровня?

Ответ 3

Я также получил эту ошибку и взял время, чтобы отследить. В какой-то момент мы собирались иметь несколько областей кеша, но в конце концов решили, что у нас будет только один пул кешей.

Когда мы объединили это изменение в более старую ветку - у нас все еще была сущность со старой стратегией пула кеша на сущность:

@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 {

Фигурированный, я бы опубликовал на случай, если кто-то еще имел подобную ситуацию.

Ответ 4

Эта ошибка очень вводит в заблуждение, я потратил почти день, чтобы наконец выяснить причину. Думал, что мой конфигурационный файл hibernate определил кеш второго уровня и класс factory, он дал мне ошибку, что hibernate.cache.region.factory_class не указан.

Я вижу, что файл hibernate.cfg.xml также доступен в classpath. Но даже после любого изменения в том, что не было никакого воздействия и не получалась такая же ошибка.

Наконец, я понял, что для целей тестирования у меня есть переопределенный файл persistence.xml, который имеет следующие недостающие свойства в разделе persistence. После добавления этой проблемы был разрешен.

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

Итак, это означает, что мое приложение не смогло найти файл hibernate.cfg.xml и как-то вместо того, чтобы давать ошибку, связанную с отсутствующей конфигурацией, он взывает к классу factory.