web-dev-qa-db-ja.com

Hibernate NoCacheRegionFactoryAvailableException

説明できない奇妙なHibernate例外が発生しています。 2次キャッシュを使用していることを示していますが、hibernate.cfg.xmlのどこに2次キャッシュを指定していません。例外は次のとおりです。

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>

この例外を引き起こす原因となるアイデアはありますか?前もって感謝します!

11
user1768830

Pa 書き込み 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>
11
Engineer

次の行を使用して修正しました:

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

しかし、Hibernateメッセージは、おそらく2次キャッシュを使用する必要があるという警告ですか?

6
siebmanb

私もこのエラーを受け取り、追跡するのにしばらく時間がかかりました。ある時点で複数のキャッシュ領域を使用する予定でしたが、最終的には1つのキャッシュプールを使用することにしました。

その変更を古いブランチにマージしたとき、エンティティごとにキャッシュプールという古い戦略を持つエンティティがまだありました。

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

キャッシュアノテーションを削除することで、org.hibernate.cache.NoCacheRegionFactoryAvailableExceptionを解決しました。

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

他の誰かが同様の状況にあった場合に備えて、私が投稿すると考えました

5
wilkejj

このエラーは非常に誤解を招く可能性があります。私はほぼ1日を費やして、最終的に根本原因を突き止めました。私のhibernate設定ファイルで第2レベルのキャッシュとファクトリクラスが定義されているとはいえ、hibernate.cache.region.factory_classが指定されていないというエラーが発生していました。

Hibernate.cfg.xmlファイルがクラスパスでも利用できることがわかります。しかし、変更を加えた後でも、影響はなく、同じエラーが発生しました。

最後に、テストの目的で、persistence-unitの下に不足しているプロパティの下にあるpersistence.xmlファイルをオーバーライドしたことに気付きました。追加した後、その問題は解決されました。

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

つまり、これは私のアプリケーションがhibernate.cfg.xmlファイルを見つけることができず、どういうわけか、構成の欠落に関連するエラーを出す代わりに、ファクトリクラスを求めて叫ぶことを意味します。

0
ashah

これらは、第2レベルのキャッシュを有効にするために追加する必要があるプロパティです

<!-- 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>
0
Shubham Chopra