0

任务:使spring jpa数据的基本方法可缓存(使用hibernate/jpa),比如

Page<T> findAll(Pageable pageable)
List<T> findAll();
etc

并在某种顶级通用接口级别上执行此操作,无需自定义 dao 实现。

这是原始主题的延续 如何在默认 Spring Data JPA 方法上添加 QueryHints?

我还没有找到解决方案,但尝试用不同的方式来解决它,包括 在数据模型类上@javax.persistence.Cacheable添加注释。@org.hibernate.annotations.Cache


以下是我的配置的一些摘录:

  1. pom.xml(取自这里):

    ...
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-ehcache</artifactId>
        <version>4.1.9.Final</version>
        <exclusions>
            <exclusion>
                <groupId>net.sf.ehcache</groupId>
                <artifactId>ehcache-core</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>net.sf.ehcache</groupId>
        <artifactId>ehcache</artifactId>
        <version>2.7.0</version>
    </dependency>
    ...
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
        <version>1.4.2.RELEASE</version>
    </dependency>
    ...
    
  2. 应用程序上下文.xml:

    <tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/>
    <bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>     
    <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
        <property name="persistenceUnitName" value="persistenceUnit"/>
        <property name="dataSource" ref="dataSource"/>
    </bean>
    
  3. 持久性.xml:

    ...
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
    <properties>
        ...
        <property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory"/>
        <property name="hibernate.cache.use_second_level_cache" value="true"/>
        <property name="hibernate.cache.use_query_cache" value="true" />
    </properties>
    ...
    
  4. 除了以上所有我已经配置了spring 3.2缓存,但最终我想要一个不基于spring缓存的解决方案,所以目前我不使用spring缓存配置。

  5. 我的模型看起来像:

    @Entity
    @Table(name = "ABC")
    @Cacheable(true)
    @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
    public class ABC {
    ...
    
  6. 我的父通用 DAO 看起来像:

    public interface CacheableGenericDao<T, ID> extends JpaRepository<T, ID>, JpaSpecificationExecutor<T> {
        List<T> findAll();
        Page<T> findAll(Pageable pageable);
        <S extends T> S save(S entity);
        ...
    

PS 这里是关于该主题的另一个有用的链接,但我确实想使用基本的方法名称。

那么我在概念上缺少什么?有什么办法还是我想要太多?

4

1 回答 1

0

这就是事情的发展方式:jira.springsource.org/browse/DATAJPA-173

于 2013-11-13T20:18:48.537 回答