EDIT: 我应该声明我已经研究了几天了 - 在"how to configure ehcache with Hibernate"上有 plenty 的信息,但他们大多没有提到使用JPA和注释 - 他们要么是指纯粹的Hibernate,要么是通过XML进行配置 . (只是想说清楚我已经在这个问题的互联网上了 . )我'm using JPA and annotations, so most of these configuration guides refer to files I don't在我的应用程序中(如hbm.xml文件) .
我有一个使用Hibernate 3.6.10.FINAL,Spring Data 1.3.2.RELEASE和Spring版本3.2.1.RELEASE的应用程序 . 我试图让第二级缓存在hibernate中工作 . 根据文档,我可以通过包含以下依赖项和配置来实现:
(pom.xml的)
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>${hibernate.version}</version>
</dependency>
(persistence.xml中)
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider" />
<property name="hibernate.cache.use_second_level_cache" value="true" />
<property name="hibernate.cache.use_query_cache" value="true" />
<property name="hibernate.generate_statistics" value="true" />
我使用javax.persistence.Cacheable注释注释了我的一个实体类,并尝试在JUnit测试中查看统计信息:
public void cacheTest() {
RandomDataGenerator randomData = new RandomDataGenerator();
for (int i = 0; i < 10; i++) {
AppMaster master = masterService.findOne(randomData.nextLong(1, 10));
logger.debug(String.format("Read one record back = %1$d, %2$s", master.getApplicationId(), master.getApContact()),AppMasterServiceTest.class);
// Get statistics from hibernate session
Session session = (Session)masterService.getEntityManager().getDelegate();
Statistics statistics = session.getSessionFactory().getStatistics();
logger.debug(String.format("Second level stats = %1$d, %2$d, %3$d",
statistics.getSecondLevelCachePutCount(),
statistics.getSecondLevelCacheHitCount(),
statistics.getSecondLevelCacheMissCount()), AppMasterServiceTest.class);
}
但统计数据似乎始终为零 .
2013-11-11 11:20:33,908 DEBUG [main] test.service.AppMasterServiceTest - Second level stats = 0, 0, 0
任何人都可以帮我诊断吗?
1 回答
javax.persistence.Cachable要求您在persistence.xml中设置ENABLE_SELECTIVE . 您应该包含如下所示的行:
查看http://docs.oracle.com/javaee/6/api/javax/persistence/Cacheable.html上的文档
另外,请看一下这个相关的问题:How to use JPA2's @Cacheable instead of Hibernate's @Cache