Hibernate 菜鸟教程 16 二级缓存

GitHub

src="//ghbtns.com/github-btn.html?user=je-ge&repo=hibernate&type=watch&count=true" scrolling="0" width="110" height="20">*

配置文件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

如果觉得我的文章或者代码对您有帮助,可以请我喝杯咖啡。
您的支持将鼓励我继续创作!谢谢!
微信打赏
支付宝打赏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值