spring-data-jpa二级缓存与ehcache需要@QueryHints才能运行.这不是一个矫枉过正的事吗?

bla*_*sei 6 caching hibernate jpa spring-data

我实际上并不确定我是否正在做正确的事情但我发现在使用域POJO顶部的缓存或可缓存注释并设置hibernate.cache.use_query_cache为true以在缓存开始工作之前必须在JpaRepository查询方法上添加@QueryHint时,这样做太过分了.

据我所知,在界面级别声明方法是使用spring-data-jpa使所有东西如此精简的原因.

除非我添加@QueryHints(value = {@QueryHint(name = "org.hibernate.cacheable", value = "true")})到接口下面查询不会缓存

public interface UserRepository extends JpaRepository<User,String> {
@QueryHints(value = {@QueryHint(name = "org.hibernate.cacheable", value = "true")})
    User findByEmail(String email);
}
Run Code Online (Sandbox Code Playgroud)

Spring db应用程序配置

 <?xml version="1.0" encoding="UTF-8"?>
<beans ...">

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${h2.jdbc.driverClassName}"/>
    <property name="url" value="${h2.jdbc.url}"/>
    <property name="username" value="${h2.jdbc.username}"/>
    <property name="password" value="${h2.jdbc.password}"/>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" depends-on="flyway">
    <property name="dataSource" ref="dataSource"/>
    <property name="persistenceUnitName" value="normal"/>
    <property name="packagesToScan" value="net.personal.tutorials.security.domain"/>

    <property name="jpaProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
             <!--..... -->
            <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory</prop>
            <prop key="hibernate.cache.use_second_level_cache">true</prop>
            <prop key="hibernate.cache.use_query_cache">true</prop>
            <prop key="javax.persistence.sharedCache.mode">ENABLE_SELECTIVE</prop>
        </props>
    </property>
</bean>
<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
<jpa:repositories base-package="net.personal.tutorials.security.repository"/>
Run Code Online (Sandbox Code Playgroud)

persistence.xml中

<?xml version="1.0" encoding="UTF-8"?>
<!--<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">-->
 <persistence xmlns="http://java.sun.com/xml/ns/persistence"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
         version="2.0">
  <persistence-unit name="normal" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
  </persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)

ehcache.xml中

 <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:noNamespaceSchemaLocation="ehcache.xsd"
     updateCheck="true"
     monitoring="autodetect"
     dynamicConfig="true">
   <defaultCache maxElementsInMemory="100" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="900" />

   <!--<diskStore path="java.io.tmpdir" />-->
   <cache name="net.personal.tutorials.security.domain.User"
          maxEntriesLocalHeap="10000"
          maxEntriesLocalDisk="1000"
          eternal="false"
          diskSpoolBufferSizeMB="20"
          timeToIdleSeconds="300" timeToLiveSeconds="600"
          memoryStoreEvictionPolicy="LFU"
          transactionalMode="off">
          <persistence strategy="localTempSwap" />
   </cache>
  </ehcache>
Run Code Online (Sandbox Code Playgroud)

net.personal.tutorials.security.domain.User

@Entity
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class User {

  @Id
  private String Id;
  @Column(name = "email", length = 255, unique = true)
  private String email;
  private String password;
  private String comment;
  //setters and getters
}
Run Code Online (Sandbox Code Playgroud)

使用二级缓存的最佳推荐方法是什么?

谢谢