• hibernate框架(3)---持久化对象


    持久化对象

          再讲持久化对象之前,我们先来理解有关session中get方法与 load方法区别:

    简单总结:

    (1)如果你使用load方法,hibernate认为该id对应的对象(数据库记录)在数据库中是一定存在的,所以它可以放心的使用,它可以放心的使用代理来延迟加载该对象。

    在用到对象中的其他属性数据时才查询数据库,但是万一数据库中不存在该记录,那没办法,只能抛异常。

       由于session中的缓存对于hibernate来说是个相当廉价的资源,所以在load时会先查一下session缓存看看该id对应的对象是否存在,不存在则创建代理。所以如果你知道该id在数据库中一定有对应记录存在就可以使用load方法来实现延迟加载。

     对于get方法,hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查数据库,数据库中没有就返回null。

    (2)get不支持lazy,load支持lazy
            lazy表示只有在用到的时候才加载数据,
            如:Student student = (Student)session.load(Student.class,1);  //不会发出SQL语句
                student.getName();   //这条语句才会发出SQL语句
        而使用get方法,Student student = (Student)session.get(Student.class,1);  //会发出SQL语句

            理解OID

            用来持久化数据的唯一标识,在小配置里边的id标签中存在

    Hibernate的持久化类状态
      持久化类:就是一个实体类 与 数据库表建立了映射.
      Hibernate为了方便管理持久化类,将持久化类分成了三种状态.
        瞬时态 transient (临时态):持久化对象没有唯一标识OID.没有纳入Session的管理
        持久态 persistent :持久化对象有唯一标识OID.已经纳入到Session的管理(持久化持久态对象有自动更新数据库的能力)
        脱管态 detached (离线态):持久化对象有唯一标识OID,没有纳入到Session管理

    区分三种持久化对象的状态

     1 // 区分持久化对象的三种状态:
     2 public void demo1(){
     3   // 1.创建Session
     4   Session session = HibernateUtils.openSession();
     5   // 2.开启事务
     6   Transaction tx = session.beginTransaction();
     7   // 向数据库中保存一本图书:
     8   Book book = new Book();    // 瞬时态:没有唯一标识OID,没有与session关联.
     9   book.setName("Hiernate开发");
    10   book.setAuthor("孙XX");
    11   book.setPrice(65d);
    12   session.save(book); // 持久态:有唯一标识OID,与session关联.  
    13   // 3.事务提交
    14   tx.commit();
    15   // 4.释放资源
    16   session.close();
    17   book.setName("Struts2开发"); // 脱管态:有唯一的标识,没有与session关联.
    18 }

    三种状态对象转换
      瞬时态
        获得:Book book = new Book();
        瞬时--->持久:save(book)  (save()/saveOrUpdate())
        瞬时--->脱管:book.setId(1);
      持久态
        获得:Book book = (Book)session.get(Book.class,1)  (get()/load()/find()/iterate())
        持久--->瞬时:delete(book)  (特殊状态:删除态(被删除的对象,不建议去使用))
        持久--->脱管:session.close()  (close()/clear()/evict())
      脱管态
        获得: Book book = new Book();
            book.setId(1);
        脱管--->持久:session.update()  (update()/saveOrUpdate()/lock())
        脱管--->瞬时:book.setId(null)

    持久态对象有自动更新数据库的能力(自动更新数据库的能力依赖了Hibernate的一级缓存)

     1 // 测试持久态的对象自动更新数据库
     2 public void demo2(){
     3   Session session = HibernateUtils.openSession();
     4   Transaction tx = session.beginTransaction();
     5   // 获得一个持久态的对象.
     6   Book book = (Book) session.get(Book.class, 1);
     7   book.setName("Struts2开发");
     8   // session.update(book);//不需要写这句话,在事务提交后即可完成更新
     9   tx.commit();
    10   session.close();
    11 }

    先说明下,本文主要是参考博客名为:凌晨三点文章,非常感谢提供这么好的文章!

     

  • 相关阅读:
    SpringBoot exception异常处理机制源码解析
    集群时间同步
    VMware 克隆的相关设置
    MySQL安装
    MogliFS与spring mvc结合简单示例
    MogileFS与spring结合
    MogileFS表说明
    使用Maven编译项目遇到——“maven编码gbk的不可映射字符”解决办法
    IAT HOOK 简单实现
    进程加载_模块隐藏
  • 原文地址:https://www.cnblogs.com/qdhxhz/p/6486307.html
Copyright © 2020-2023  润新知