zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    8-16 不无聊序列 non-boring sequences uva1608
    8-8 Ddfense Line uva1471 优先级队列
    8-12 Erratic Expansion uva12627
    8-4 Fabled Rooks uva11134
    8-10 Coping Books uva714
    8-13 Just Finish it up uva11093
    8-11 Add All uva 10954
    8-2 Building for UN Uva1605
    css定位.py
    处理HTML5视频播放.py
  • 原文地址:https://www.cnblogs.com/je-ge/p/6105419.html
Copyright © 2011-2022 走看看