• JavaWeb学习:Hibernate 持久化类


    一、什么是持久化

    持久化:把内存中的数据存储到数据库(数据库是硬盘上的文件)中

    二、什么是持久化类

    持久化类:Java类(class)和数据库中表存在映射关系(class名.hbm.xml)

    三、Hibernate的持久化类的编写规则

      无参数构造(用于反射实例化对象)

      属性私有,提供get、set方法

      属性尽量使用包装类(Interg、Long...,包装类类型默认值为null)

      提供一个唯一OID与主键对应(Java中通过对象地址区分是否为同一对象,数据库通过主键区分是否为同一记录,Hibernate通过持久化类的OID的属性区分是否为同一对象)

      不要使用final修饰(用于使用代理对象)

    四、Hibernate 持久化类三种状态

      ①、瞬时态:没有唯一标识OID,没有被session管理

      ②、持久态:有唯一标识OID,已经被session管理

      ③、脱管态:有唯一标识OID,没有被session管理

        @Test
        public void demo2() {
        Session session=HibernateUtils.openSession();
        Transaction transaction=session.beginTransaction();
    
        Customer customer=new Customer();//瞬时态
        customer.setCust_name("zhang");
        
        session.save(customer);//持久态
    
        transaction.commit();
        session.close();
        
        System.out.println(customer.getCust_name());//session.close();托管态
        }

    五、三种状态转换

      ①、瞬时态

        获取

    Customer customer=new Customer();

        瞬时态=>持久态

          Serializable save(Object obj)、saveOrUpdate(Object obj)

        瞬时态=>托管态(本质:缺少OID)      

    Customer customer=new Customer();
    customer.setCust_id(1l);

      ②、持久态

        获取

          get()、load()、find()、iterate()

    Customer customer=session.get(Customer.class,1l);

        持久态=>瞬时态

          delete();

        持久态=>托管态

          close()、clear()、evict(Object obj)

      ③、托管态

        获取    

    Customer customer=new Customer();
    customer.setCust_id(1l);

        托管态=>持久态

          update()、saveOrUpdate()

        托管态=>瞬时态      

    customer.setCust_id(null);

    六、持久态对象自动更新数据库

        @Test
        public void demo6() {
        Session session=HibernateUtils.openSession();
        Transaction transaction=session.beginTransaction();
        //获取持久态对象
        Customer customer=session.get(Customer.class, 2l);
        customer.setCust_name("zhao");
        
        //session.update(customer);//没有update
        
        transaction.commit();
        session.close();
        }

     再次执行,数据没有变更的情况下不会更新

    自动更新数据的底层原理是:Hibernate的一级缓存

    七、Hibernate缓存

    缓存:一种优化方式,将数据存储在内存中,获取数据直接从内存中读取,不需要读取硬盘

      Hibernate框架中提供了优化方式:缓存、抓取策略。

      Hibernate中提供了二种缓存机制:一级缓存、二级缓存。

      Hibernate一级缓存:是Session缓存,一级缓存生命周期与Session一致,一级缓存是自带的不可卸载。

      一级缓存:是由Session中一系列Java集合构成的,默认开启

      二级缓存:是SessionFactory级别的缓存,需要配置的缓存,默认不开启

    在使用Hibernate查询对象时,首先会使用对象属性的OID值在Hibernate的一级缓存中查找,如果找到匹配OID的对象,将直接从一级缓存中取出使用,不会查询数据库,如果没找到匹配OID的对象,则查询数据库。

    HIbernate一级缓存作用:减少对数据库的访问次数

    HIbernate一级缓存特点:

      ①、调用Session接口的save()、update()、saveOrUpdate()时,缓存中没有相应对象,自动从数据库中查询到相应信息加入到缓存中。

      ②、调用Session接口的load()、get()方法,以及Query接口的list()、iterator()方法时,判断缓存中是否存在该对象,有则返回,不会查询数据库,没有则查询数据库,并添加到一级缓存中。

      ③、Session的close()方法,Session缓存清空。

     证明一级缓存存在:

      @Test
        public void demo() {
        Session session=HibernateUtils.openSession();
        Transaction transaction=session.beginTransaction();
        
        /*
         * Customer customer1=session.get(Customer.class, 2l);//发送SQL
         * System.out.println(customer1); 
         * Customer customer3=session.get(Customer.class, 3l);//不发送
         * SQL System.out.println(customer3);
         */
        
        Customer customer=new Customer();
        customer.setCust_name("zhao");
        Serializable id=session.save(customer);//发送SQL
        
        Customer customer2=session.get(Customer.class, id);//不发送SQL
        System.out.println(customer2);
        
        transaction.commit();
        session.close();
        }

    一级缓存的快照区:当一个持久化类设置属性值,缓存区数据会重新保存,当事务提交时,缓存区数据和快照区的数据比较,不一致时,自动更新数据,一致时,就不更新数据

  • 相关阅读:
    【Java学习笔记十二】——初窥多线程
    【Java】使用swing实现简易计算器
    【Java学习技巧分享】——IDEA快捷键(超全!!!)
    【Java学习笔记九】——I/O流之字符流与数据流
    【Java学习笔记八】——I/O流之InputStream和OutputStream
    算法导论15章答案
    算法导论32章答案
    右击任务栏应用图标不显示菜单后的无奈美化
    verilog
    进制表示以及转换
  • 原文地址:https://www.cnblogs.com/WarBlog/p/13927016.html
Copyright © 2020-2023  润新知