JPA中的一级缓存和二级缓存是什么?如何配置?代码举例讲解

JPA中的缓存分为一级缓存和二级缓存:

一级缓存:

  1. 一级缓存是EntityManager级别的缓存。同一个EntityManager加载的相同实体,会第2次直接从缓存中获取。
  2. 一级缓存与同一EntityManager下的事务相关联。事务提交或回滚,会清空缓存。
  3. 一级缓存默认开启,无需配置。

二级缓存:

  1. 二级缓存是SessionFactory级别的缓存。不同EntityManager加载的相同实体,会从二级缓存中获取。
  2. 二级缓存与EntityManager Factory相关联,其生命周期与Factory相同。
  3. 二级缓存需要手动配置映射文件或实体类才能开启。在映射文件中配置元素;或者在实体类上使用@Cacheable注解。
  4. 二级缓存使用Cache提供者实现,常见的有Ehcache、Infinispan等。需要指定对应的Cache提供者。

代码示例:

// 映射文件 cache 配置
<entity-mapping>  
    <caching usage="READ_ONLY"/>  
</entity-mapping>  

// 实体类 cache 配置  
@Entity
@Cacheable
public class Product {
  ...
}  

// 二级缓存使用 Ehcache
<property name="hibernate.cache.region.factory_class"  
          value="org.hibernate.cache.ehcache.EhCacheRegionFactory"/>