2013-08-03 5 views
1

Я пытаюсь использовать SecondLevelCache с гибернацией. Это мой файл конфигурации XML:Hibernate Second Level Cache & JUnit

<persistence-unit name="EntityTestHibernate" transaction-type="RESOURCE_LOCAL"> 
     <properties> 
      <property name="hibernate.show_sql" value="false"/> 
      <property name="hibernate.format_sql" value="false"/> 
      <property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/DB_NAME"/> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/> 
      <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/> 
      <property name="hibernate.connection.username" value="USERNAME"/> 
      <property name="hibernate.connection.password" value="PASSWORD"/>    
      <property name="hibernate.cache.use_second_level_cache" value="true"/>    
      <property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.EhCacheProvider" /> 
      <property name="hibernate.cache.provider_configuration_file_resource_path" value="/test/ehcache.xml" />  
     </properties> 
    </persistence-unit> 

Мой ehcache.xml:

<ehcache name="cacheTest" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"> 
    <defaultCache eternal="true" maxElementsInMemory="100" overflowToDisk="false" /> 
    <cache name="entityCache" 
      maxEntriesLocalHeap="50" 
      eternal="false" 
      timeToLiveSeconds="120"   
    /> 
</ehcache> 

и на моем объекте имеется аннотацию, как этот

@Cache(region="entityCache", usage=CacheConcurrencyStrategy.READ_WRITE) 

Когда я запускаю UnitTest У меня есть следующая ошибка (проблема такая же, если я задал или не аннотацию на ней @DirtiesContext):

net.sf.ehcache.CacheException: Another CacheManager with same name 'cacheTest' already exists in the same VM. Please provide unique names for each CacheManager in the config or do one of following: 
1. Use one of the CacheManager.create() static factory methods to reuse same CacheManager with same name or create one if necessary 
2. Shutdown the earlier cacheManager before creating new one with same name. 
The source of the existing CacheManager is: DefaultConfigurationSource [ ehcache.xml or ehcache-failsafe.xml ] 
    at net.sf.ehcache.CacheManager.assertNoCacheManagerExistsWithSameName(CacheManager.java:573) 
    at net.sf.ehcache.CacheManager.init(CacheManager.java:389) 
    at net.sf.ehcache.CacheManager.<init>(CacheManager.java:371) 
    at net.sf.ehcache.hibernate.EhCacheProvider.start(EhCacheProvider.java:93) 
    at org.hibernate.cache.impl.bridge.RegionFactoryCacheProviderBridge.start(RegionFactoryCacheProviderBridge.java:72) 
    at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:238) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872) 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:850) 
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:48) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32) 

Я только что настроил свой CacheManager с hibernate xml-файлом, и я не знаю, как управлять этой ошибкой. Я где-то читал, что должен использовать RegionFactory, но в документации ehcache это не лучшая практика. Как я могу решить свою проблему правильно?

ответ

1

Не знаете, где вы видели, что использование RegionFactory - это не лучшая практика ... проверьте документацию ehcache на странице http://ehcache.org/documentation/user-guide/hibernate#Configure-Ehcache-as-the-Second-Level-Cache-Provider...and, это именно то, что они говорят, что вы должны использовать.

Кроме того, Вы должны использовать SingletonEhCacheRegionFactory, который должен исправить проблему JUnit (Singleton означает, что будет 1 кэш яслей только ... поэтому нет 2 cachemanager с таким же cachename, как показано в вашем исключении)

сети. sf.ehcache.hibernate.SingletonEhCacheRegionFactory

Обратите внимание: Для Hibernate 4 используйте org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory вместо net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory

Надежда, что помогает.