java - Ehcache 二级缓存不适用于 JPA 和 Hibernate?

标签 java hibernate jpa ehcache

编辑:我应该说我已经研究了几天了——有大量关于“如何使用 Hibernate 配置 ehcache”的信息但它们大多不涉及使用 JPA 和注释——它们要么指的是纯 Hibernate,要么指的是通过 XML 进行配置。 (只是想说明一下,我已经在互联网上了解过这个问题。)我使用的是 JPA 和注释,所以这些配置指南中的大部分都引用了我的应用程序中没有的文件(比如 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>

(持久性.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

谁能帮我诊断一下?

最佳答案

javax.persistence.Cachable 要求您在 persistence.xml 中设置 ENABLE_SELECTIVE。您应该包括如下一行:

<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>

查看 http://docs.oracle.com/javaee/6/api/javax/persistence/Cacheable.html 上的文档

另外,看看这个相关问题:How to use JPA2's @Cacheable instead of Hibernate's @Cache

关于java - Ehcache 二级缓存不适用于 JPA 和 Hibernate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19913168/

相关文章:

java - JPA/Hibernate (PSQL) 不创建连接表

java - JUnit5 中缺少 org.junit.jupiter.params

Java从字符串中删除公钥页眉和页脚

java - spring boot 自定义 validator 运行两次

java - org.hibernate.exception.SQLGrammarException : could not execute query

sql - 在一对一关系中插入

java - 我将如何像这样打印出递归跟踪?

java - 使用 itext 直接创建 pdf 到数据库

java - Hibernate 映射与动态查询

java - 为 JPA EntityManager persist() 方法提供另一个操作