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

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

     

  • 相关阅读:
    笔记35 跨重定向请求传递数
    判断邮箱的正则表达式
    按钮
    async await 的用法
    笔记34 Spring MVC的高级技术——处理multipart形式的数据
    Convert Sorted Array to Binary Search Tree
    Binary Tree Zigzag Level Order Traversal
    Unique Binary Search Trees,Unique Binary Search Trees II
    Validate Binary Search Tree
    Populating Next Right Pointers in Each Node,Populating Next Right Pointers in Each Node II
  • 原文地址:https://www.cnblogs.com/qdhxhz/p/6486307.html
Copyright © 2011-2022 走看看