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-二级缓存的更多相关文章

  1. Hibernate 系列教程17-查询缓存

    在二级缓存配置成功的基础上进行查询缓存配置 Product public class Product { private Long id; private String name; Product.h ...

  2. 【Hibernate】Hibernate系列7之二级缓存

    二级缓存 7.1.概述 7.2.配置方法

  3. Hibernate 系列教程15-一级缓存

    Product public class Product { private Long id; private String name; Product.hbm.xml <class name= ...

  4. CRL快速开发框架系列教程六(分布式缓存解决方案)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  5. CRL快速开发框架系列教程五(使用缓存)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  6. Hibernate的查询,二级缓存,连接池

    Hibernate的查询,二级缓存,连接池 1.Hibernate查询数据 Hibernate中的查询方法有5中: 1.1.Get/Load主键查询 使用get或者load方法来查询,两者之间的区别在 ...

  7. hibernate框架学习之二级缓存

    缓存的意义 l应用程序中使用的数据均保存在永久性存储介质之上,当应用程序需要使用数据时,从永久介质上进行获取.缓存是介于应用程序与永久性存储介质之间的一块数据存储区域.利用缓存,应用程序可以将使用的数 ...

  8. NHibernate教程(21)——二级缓存(下)

    本节内容 引入 使用NHibernate二级缓存 启用缓存查询 管理NHibernate二级缓存 结语 引入 这篇我还继续上一篇的话题聊聊NHibernate二级缓存剩下的内容,比如你修改.删除数据时 ...

  9. NHibernate教程(20)——二级缓存(上)

    本节内容 引入 介绍NHibernate二级缓存 NHibernate二级缓存提供程序 实现NHibernate二级缓存 结语 引入 上一篇我介绍了NHibernate内置的一级缓存即ISession ...

随机推荐

  1. Spring入门学习(二)三种实例化bean的方法

    前面的哪一种就是通过构造函数来实例化对象 下面我们可能用到工厂方法来视力话对象,这样我们的配置文件又该怎么配置呢 <bean name="service2" class=&q ...

  2. Java8 (1)

    参考资料: <Java8 in Action> Raoul-Gabriel Urma 一.jdk8 客观的说,Java8是一次有重大演进的版本,甚至很多人认为java8所做的改变,在许多方 ...

  3. 判断括号字符串是否为合法+求n对括号的所有组合

    n对括号的有效组合数 参考:https://zh.wikipedia.org/wiki/%E5%8D%A1%E5%A1%94%E5%85%B0%E6%95%B0 import java.util.Ar ...

  4. Gentoo: !!! existing preserved libs问题

    问题描述 !!! existing preserved libs: >>> package: media-libs/libmng-2.0.2-r1 * - /usr/lib/libm ...

  5. UITextField的属性设置

    1.背景颜色 field.backgoundColor = [UIColor redColor]; 2.设置field文字 field.text = @"输入文字"; 3.设置fi ...

  6. automake,autoconf使用详解

    本文地址: http://www.laruence.com/2009/11/18/1154.html 文章转自: http://www.linuxcomputer.cn/ 作为Linux下的程序开发人 ...

  7. 【Machine Learning in Action --3】决策树ID3算法预测隐形眼睛类型

    本节讲解如何预测患者需要佩戴的隐形眼镜类型. 1.使用决策树预测隐形眼镜类型的一般流程 (1)收集数据:提供的文本文件(数据来源于UCI数据库) (2)准备数据:解析tab键分隔的数据行 (3)分析数 ...

  8. iOS开发之 用第三方类库实现ScrollView

    转自:http://www.cnblogs.com/qianLL/p/5369127.html   在github上面有很多的第三方类库,大大节约了大家的开发时间 下载地址:https://githu ...

  9. java计数器CountDownLatch

    CountDownLatch里面有个属性为state,当为零时触发代码往下执行,代码如下: package threadLock; import java.util.Random; import ja ...

  10. sqlDeveloper连接oracle

    1.解决oracle11g的ORA-12505问题 启动oraclehome92TNSlistener服务,启动oracleserviceXXXX,XXXX就是你的database SID. < ...