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 ...
随机推荐
- Java 集合 集合与数组之间的转换
Java 集合 集合与数组之间的转换 @author ixenos 数组转集合 Arrays.asList(T... a) 先给结论:用 Arrays.asList(T... a) 将数组转换成集合 ...
- ESFramework 4.0 快速上手(06) -- Rapid引擎(续)
<ESFramework 4.0 快速上手>系列介绍的都是如何使用Rapid引擎(快速引擎) -- RapidServerEngine 和 RapidPassiveEngine.其实,大家 ...
- Linode开通新加坡机房:vps速度快,价格不变!
vps服务商linode终于开通了新加坡机房中心,这是linode全球第7个机房,满足日益增长的东南亚市场需求.印度.中国.澳大利亚及周边国家都有很好的用户体验. linode新加坡机房采用思科Cis ...
- 评测:VPS推荐digitalocean和Vultr和Linode
美国vps推荐三家,分别是digitalocean.vultr和linode,拥有很高的性价比,中国访问速度快.我是上面三家的早期用户,并且一直使用至今,积累了不少使用经验. DigitalOcean ...
- chapter11_1 Lua数组、列表
Lua中的table可以表示其他语言提供的数据结构:数组.记录.线性表.队列.集合等. 在Lua中很少编写搜索算法,因为table本身就提供了直接访问任意类型的功能. 数组 使用整数来索引table即 ...
- Servlet详解
原文出处:http://blog.csdn.net/q547550831/article/details/50458456 Servlet详解 基本概述 Session在计算机中,尤其是在网络应用中, ...
- 数组实现UITabview的cell设置
- yaf for ubuntu安装
一.安装yaf需要的扩展 apt-get install perl-modules apt-get install libpcrecpp0 apt-get install libpcre3 libpc ...
- vmware 安装提示the msi failed
原因是卸载不干净,使用批处理bat文件卸载,然后重启即可. VMware workstation 10.0序列号:MA491-6NL5Q-AZAM0-ZH0N2-AAJ5A 百度云文件:http:// ...
- HTML之打开/另存为/打印/刷新/查看原文件等按钮的代码
■打开■ <input name=Button onClick=document.all.WebBrowser.ExecWB(1,1) type=button value=打开> < ...