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

如果觉得我的文章对您有帮助,请予以打赏。您的支持将鼓励我继续创作!谢谢!
微信打赏
支付宝打赏

原文地址:https://www.cnblogs.com/je-ge/p/6105419.html