美文网首页Hibernate 菜鸟教程
Hibernate 菜鸟教程 16 二级缓存

Hibernate 菜鸟教程 16 二级缓存

作者: JeGe | 来源:发表于2016-12-18 17:38 被阅读31次

    配置文件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 二级缓存

        本文链接:https://www.haomeiwen.com/subject/ejhzmttx.html