首先
需要在persistence.xml里配置缓存策略开启二级缓存(一级缓存是默认开启的,二级缓存需要手动配置之后才会开启),配置代码如下:
<!--持久化单元名称-->
<persistence-unit name="xxx" transaction-type="RESOURCE_LOCAL">
<!--配置缓存策略-->
<!-- 如果实体类上面标识 @Cacheable(true) 这个实体会被缓存-->
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<properties>
<!-- 必须配置4个连接数据库属性 -->
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
<property name="hibernate.connection.url" value="jdbc:mysql:///db_domain" />
<property name="hibernate.connection.username" value="root" />
<property name="hibernate.connection.password" value="123456" />
<!-- 必须配置1个方言属性 -->
<!-- 实现跨数据库关键类 :查询MySQLDialect的getLimitString方法 -->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<!-- 可选配置 -->
<!-- 是否自动生成表 -->
<property name="hibernate.hbm2ddl.auto" value="update" />
<!-- 是否显示sql -->
<property name="hibernate.show_sql" value="true" />
<!-- 格式化sql -->
<!-- <property name="hibernate.format_sql" value="true" /> -->
<!-- 启用二级缓存-->
<property name="hibernate.cache.use_second_level_cache" value="true" />
<!-- 二级缓存实现类-->
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory" />
<!-- 启动查询缓存-->
<property name="hibernate.cache.use_query_cache" value="true" />
</properties>
</persistence-unit>
之后
创建一个实体类Product.java,代码如下:
@Entity
@Table(name="t_product")
@Cacheable(true)//打上此注解该实体类才会被缓存
public class Product {
@Id
@GeneratedValue
private Long id;
private String name;
@Override
public String toString() {
return "Product{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
public Product() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
最后
创建一个测试类TestCache.java进行缓存命中的测试,代码如下
public class TestCache {
@Test
public void test() throws Exception{
EntityManager entityManager1 = JpaUtil.getEntityManager();
//先查询出来 放入一级缓存和二级缓存里面
Product product1 = entityManager1.find(Product.class, 1L);
//先从一级缓存里面找,如果有命中
Product product2 = entityManager1.find(Product.class, 1L);
EntityManager entityManager2 = JpaUtil.getEntityManager();
//先从一级缓存找 没有,从二级缓存找,有 ,在放入一级缓存
Product product3 = entityManager2.find(Product.class, 1L);
//一级缓存有命中
Product product4 = entityManager2.find(Product.class, 1L);
}
}
运行之后会发现控制台只会打印出一条sql语句:
(这里注意:一级缓存命中条件:同一个EntityManagerFactory 同一个EntityManager 同一个OID;二级缓存命中条件: 同一个EntityManagerFactory 不同EntityManager 同一个OID)
还有:这个是maven项目所以还需要在pom.xml中添加对二级缓存jar包的依赖,代码如下:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>4.3.8.Final</version>
</dependency>