User user=entityManager.find(User.class,5);
User user2=entityManager.find(User.class,5);
输出
Hibernate:
select
user0_.id as id1_6_0_,
user0_.name as name2_6_0_
from
user user0_
where
user0_.id=?
很显然,只向数据库发起一次查询,这就是一级缓存的作用
User user=entityManager.find(User.class,5);
entityManager.close();
entityManager=entityManagerFactory.createEntityManager();
User user2=entityManager.find(User.class,5);
会查两次,EntityManager关闭了,缓存也就失效了
Hibernate:
select
user0_.id as id1_6_0_,
user0_.name as name2_6_0_
from
user user0_
where
user0_.id=?
Hibernate:
select
user0_.id as id1_6_0_,
user0_.name as name2_6_0_
from
user user0_
where
user0_.id=?
使用二级缓存
所谓的二级缓存,也就是可以跨entityManager的缓存,也就是说:就算你关闭了entityManager,缓存也依然在。
在配置文件persistence.xml中配置
<!-- 二级缓存相关 -->
<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"/>
启用二级缓存:
缓存需要以下包
引入jar包时注意jar包版本
1.在实体类上加注解@Cacheable(true)
@Cacheable(true)
@Table(name="USER")
@Entity
public class User ...
在persistence.xml文件中配置二级缓存的策略
<!--
配置二级缓存的策略
ALL:所有的实体类都被缓存
NONE:所有的实体类都不被缓存.
ENABLE_SELECTIVE:标识 @Cacheable(true) 注解的实体类将被缓存
DISABLE_SELECTIVE:缓存除标识 @Cacheable(false) 以外的所有实体类
UNSPECIFIED:默认值,JPA 产品默认值将被使用
-->
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
注意该配置要放在provider和class节点的后边
输出,只查了一次
Hibernate:
select
user0_.id as id1_6_0_,
user0_.name as name2_6_0_
from
user user0_
where
user0_.id=?