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();
    }

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

原文地址:https://www.cnblogs.com/WarBlog/p/13927016.html