【发布时间】:2019-09-04 12:29:41
【问题描述】:
我尝试为 Spring Data JPA 启用 JPA 二级缓存。我在 persistence.xml 中启用了缓存:
<persistence-unit name="ds-default">
<jta-data-source>SAMPLE_DATASOURCE</jta-data-source>
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<properties>
<property name="hibernate.cache.use_second_level_cache" value="true" />
<property name="hibernate.cache.use_query_cache" value="true" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.cache.region.factory_class" value="org.jboss.as.jpa.hibernate5.infinispan.InfinispanRegionFactory" />
</properties>
</persistence-unit>
在我的存储库中,我还提供了缓存的查询提示:
public interface SampleRepository extends JpaRepository<SampleEntity, String> {
@Override
@QueryHints(value = {
@QueryHint(name = "org.hibernate.cacheable", value = "true")
})
List<SampleEntity> findAll();
}
我希望 findAll 查询的结果应该被缓存,并且我应该在日志中只看到一个选择查询。但是,我不止一次看到它,这使我得出缓存配置不正确的结论。我错过了什么?
我不想使用 Spring Cache 机制(我不使用 Spring Boot 等)。
【问题讨论】:
-
如果您在 java 中配置
LocalContainerEntityManagerFactory,请在 java 代码中添加属性,而不是在persistence.xml中。 -
我没有自己创建EntityManagerFactory(我通过@PersistenceContext注入EntityManager)
-
请阅读我的评论。根据您的问题,您没有使用 Spring Boot,因此您的配置中有一些东西可以配置
LocalContainerEntityManagerFactory,这反过来又会创建EntityManagerFactory。 -
它由应用服务器(JBoss 或 WebSphere)提供。
-
您的 Spring 配置中必须有一些东西可以添加 bean,否则它将无法工作。或者您没有使用 Spring,而是在 JEE 环境中使用 Spring Data JPA(这是可能的,但在回答问题时会有很大的不同!)。还要确保您的实体是可缓存的(即具有
@Cacheable注释,否则它也不会缓存。
标签: hibernate jpa spring-data-jpa