2013-10-10 13 views
10

Ricevo una bizzarra eccezione Hibernate che non riesco a spiegare. Mi sta dicendo che sto usando la cache di secondo livello, ma non dove in hibernate.cfg.xml devo specificare una cache di secondo livello. Ecco l'eccezione:Hibernate NoCacheRegionFactoryAvailableException

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) 

E il mio 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> 

Tutte le idee che sarebbe innescare questa eccezione? Grazie in anticipo!

+0

Vedo che questa è una domanda piuttosto vecchia, tuttavia ancora oggi aiutata! Stavo anche ricevendo questa eccezione e lui mi ha aiutato a seguirlo da @wilkejj. Hibernate, presumo le annotazioni dei controlli. E nel mio caso, ho trovato annotazione '@Cache (usage = CacheConcurrencyStrategy.READ_ONLY) 'essere quello che attiva la cache di secondo livello. Quando l'ho rimosso, tutto ha funzionato come un incantesimo! – jaruss

risposta

9

Pau scritto il hibernate.cache.region.factory_class Required in hibernate.cfg.xml:

L'eccezione è abbastanza auto-esplicativo. Devi impostare la proprietà hibernate.cache.region.factory_class. Per esempio con EHCache sarebbe aggiunta la seguente riga:

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

Grazie a @Yousuf Umar (+1) - So che l'eccezione è auto-esplicativa, e proverò il tuo suggerimento. Tuttavia sono confuso riguardo al ** perché ** lo prendo quando non faccio alcun riferimento alla cache di secondo livello all'interno del mio 'hibernate.cfg.xml'. In altre parole, ** perché Hibernate pensa che io debba usare una cache di secondo livello? ** So che in Hibernate le cache di 2 ° livello sono * facoltative *, quindi perché Hibernate pensa che io * abbia bisogno di * una? Grazie ancora! –

+0

Controlla se hai ha

+0

Non ho usato use_second_level_cache e Hibernate pensa che dovrei usare anche una cache di secondo livello. È apparso dopo aver aggiunto diverse nuove classi al file hibernate.cfg.xml ... – siebmanb

4

utilizzando la seguente riga risolto:

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

Ma il messaggio Hibernate è probabilmente un avvertimento che dovremmo usare cache di secondo livello?

3

Ho ricevuto anche questo errore e mi ci è voluto un po 'per rintracciare. A un certo punto avremmo avuto più cache, ma alla fine abbiamo deciso che avremmo avuto un solo pool di cache.

Quando ci siamo fusi che il cambiamento in un ramo più vecchio - avevamo ancora un'entità con la vecchia strategia di un pool di cache per entità:

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

Rimuovendo l'annotazione Cache - è risolto l'org.hibernate. cache.NoCacheRegionFactoryAvailableException:

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

ho pensato di postare nel caso qualcuno altro ha avuto una situazione simile

0

Questo errore è molto fuorviante, io Spe quasi un giorno per capire finalmente la causa principale. Ho pensato che il mio file di configurazione di ibernazione ha definito la cache di secondo livello e la classe di fabbrica, mi ha dato l'errore che hibernate.cache.region.factory_class non viene fornito.

Vedo che il file hibernate.cfg.xml è disponibile anche in classpath. Ma anche dopo ogni cambiamento non c'è stato alcun impatto e si è verificato lo stesso errore.

Infine mi sono reso conto che a scopo di test ho un file persistence.xml sovrascritto che ha sotto le proprietà mancanti sotto unità di persistenza. Dopo aver aggiunto il problema è stato risolto.

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

Quindi questo significa che la mia domanda non è stata in grado di trovare il file hibernate.cfg.xml e in qualche modo invece di dare errore relativo alla configurazione mancante, grida per la classe di fabbrica.