Hibernate 系列教程16-二级缓存
pom.xml
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>${hibernate.version}</version>
</dependency>
Product
/**
* @author JE哥
* @email 1272434821@qq.com
* @description:多方:多个产品属于同一个产品类型
*/
public class Product {
private Long id;
private String name;
private ProductType type;// 多对一
private BigDecimal price;
ProductType
/**
* @author JE哥
* @email 1272434821@qq.com
* @description:双向一方:一个产品类型下面有n个产品
*/
public class ProductType {
private Long id;
private String name;
private Set<Product> products = new HashSet<Product>();// 一对多:集合Set
Product.hbm.xml
<class name="Product">
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<property name="price" />
<many-to-one name="type" class="ProductType" column="type_id" />
</class>
ProductType.hbm.xml
<class name="ProductType">
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<set name="products" inverse="true">
<!-- 配置多方Product的外键名称 -->
<key column="type_id" />
<one-to-many class="Product" />
</set>
</class>
hibernate.cfg.xml
<!-- 开启二级缓存 -->
<property name="cache.use_second_level_cache">true</property>
<!-- 二级缓存的实现 -->
<property name="cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
<!-- 开启查询缓存 -->
<property name="cache.use_query_cache">true</property>
<mapping resource="com/jege/hibernate/second_level_cache/ProductType.hbm.xml" />
<mapping resource="com/jege/hibernate/second_level_cache/Product.hbm.xml" />
<!-- 类的二级缓存 -->
<class-cache class="com.jege.hibernate.second_level_cache.Product" usage="read-write" />
<class-cache class="com.jege.hibernate.second_level_cache.ProductType" usage="read-write" />
<!-- 类的集合二级缓存 -->
<collection-cache collection="com.jege.hibernate.second_level_cache.ProductType.products" usage="read-write" />
MainTest
public class MainTest {
@Before
public void save() throws Exception {
ProductType type = new ProductType();
type.setName("类型1");
Product product1 = new Product("产品1");
product1.setPrice(new BigDecimal(200));
Product product2 = new Product("产品2");
product2.setPrice(new BigDecimal(300));
// 建立多方到一方的关系
product1.setType(type);
product2.setType(type);
// 建立一方多到方的关系(出现多方在一方的索引)
type.getProducts().add(product2);
type.getProducts().add(product1);
Session session = HibernateUtils.INSTANCE.getSession();
session.beginTransaction();
session.save(type);// 持久化状态
session.save(product1);// 持久化状态
session.save(product2);// 持久化状态
session.getTransaction().commit();
session.close();
}
// 模拟同一个SessionFactory,不同session获取同一个OID对象
// 只发出一条sql:二级缓存命中
@Test
public void get() throws Exception {
Session session1 = HibernateUtils.INSTANCE.getSession();
Product product1 = (Product) session1.get(Product.class, 1L);
Product product2 = (Product) session1.get(Product.class, 1L);// 一级缓存命中
session1.close();
Session session2 = HibernateUtils.INSTANCE.getSession();
Product product3 = (Product) session2.get(Product.class, 1L);// 二级缓存命中
Product product4 = (Product) session2.get(Product.class, 1L);// 一级缓存命中
session2.close();
}
// 模拟同一个SessionFactory,不同session获取同一个OID对象里面的集合
// 只发出一条sql:二级缓存命中
@Test
public void get2() throws Exception {
Session session1 = HibernateUtils.INSTANCE.getSession();
ProductType productType1 = (ProductType) session1.get(ProductType.class, 1L);
System.out.println(productType1.getProducts().size());
session1.close();
Session session2 = HibernateUtils.INSTANCE.getSession();
ProductType productType2 = (ProductType) session2.get(ProductType.class, 1L);
System.out.println(productType2.getProducts().size());
session2.close();
}
}
源码地址
https://github.com/je-ge/hibernate
如果觉得我的文章对您有帮助,请予以打赏。您的支持将鼓励我继续创作!谢谢!
Hibernate 系列教程16-二级缓存的更多相关文章
- Hibernate 系列教程17-查询缓存
在二级缓存配置成功的基础上进行查询缓存配置 Product public class Product { private Long id; private String name; Product.h ...
- 【Hibernate】Hibernate系列7之二级缓存
二级缓存 7.1.概述 7.2.配置方法
- Hibernate 系列教程15-一级缓存
Product public class Product { private Long id; private String name; Product.hbm.xml <class name= ...
- CRL快速开发框架系列教程六(分布式缓存解决方案)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- CRL快速开发框架系列教程五(使用缓存)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- Hibernate的查询,二级缓存,连接池
Hibernate的查询,二级缓存,连接池 1.Hibernate查询数据 Hibernate中的查询方法有5中: 1.1.Get/Load主键查询 使用get或者load方法来查询,两者之间的区别在 ...
- hibernate框架学习之二级缓存
缓存的意义 l应用程序中使用的数据均保存在永久性存储介质之上,当应用程序需要使用数据时,从永久介质上进行获取.缓存是介于应用程序与永久性存储介质之间的一块数据存储区域.利用缓存,应用程序可以将使用的数 ...
- NHibernate教程(21)——二级缓存(下)
本节内容 引入 使用NHibernate二级缓存 启用缓存查询 管理NHibernate二级缓存 结语 引入 这篇我还继续上一篇的话题聊聊NHibernate二级缓存剩下的内容,比如你修改.删除数据时 ...
- NHibernate教程(20)——二级缓存(上)
本节内容 引入 介绍NHibernate二级缓存 NHibernate二级缓存提供程序 实现NHibernate二级缓存 结语 引入 上一篇我介绍了NHibernate内置的一级缓存即ISession ...
随机推荐
- hdu_5903_Square Distance(dp)
题目链接:hdu_5903_Square Distance 题意: 给你一个长度为n的a串,一个数m,现在让你构造一个长度也为n的b串,使这个串是由两个相同的串拼起来的,并且和a串对应的位不同的数量为 ...
- strpos 返回0时 ,比较false 不能加单引号
$a = 'a.approve'; $num = strpos($a,'a.admin'); if(strpos($a,'a.approve') !== 'false'){ //不能加单引号.变字符 ...
- 如何在Excel中少犯二(I)
作者:何明科链接:https://zhuanlan.zhihu.com/p/23472480来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 收到不少建议,要求开知乎Li ...
- From windows live writer
天线数据长度: 4*14*9664*4 = 2164736 信道估计长度: 614400 均衡: 12*1200*4 = 57600
- ural 1355. Bald Spot Revisited(数的素因子划分)
1355. Bald Spot Revisited Time limit: 1.0 secondMemory limit: 64 MB A student dreamt that he walked ...
- 调用CImg库显示WAV格式音频波形
最近在做傅里叶变换和小波变换时经常要通过显示波形来检验算法,但通过visual studio之类显示波形又显得麻烦,而且不能跨平台. CImg是一个跨平台的C++的图像处理库,提供的图像处理等功能十分 ...
- APP测试--测试日报和上线报告
1 测试日报包含: 1 对当前测试版本质量进行分级 2 对较严重的问题进行举例,提示开发人员优先修改 3 对版本的整体情况进行评估 2 上线报告: 1 对当前版本质量进行分级 2 附上测试报告(功能测 ...
- 有关webapplicationcontext的初始化
ApplicationContext是Spring的核心,Context我们通常解释为上下文环境,我想用“容器”来表述它更容易理解一些,ApplicationContext则是“应用的容器”了:在We ...
- 搭建Linux3.4.2内核编辑环境
(1)准备工作:1. 准备虚拟机2.安装工具链sudo tar xjf arm-linux-gcc-4.3.2.tar.bz2 -C /设置环境变量:sudo vi /etc/environment ...
- iOS打上线包或者测试包详细流程
首先登陆苹果官方开发者账号:http://developer.apple.com 进入到如下界面 之后进入如下界面:点击第二项创建证书 整个流程如下图4步 然后按照如下图片进行配置即可 接下来去创建C ...