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

2年前 (2022) 程序员胖胖胖虎阿
220 0 0

持久化对象

      再讲持久化对象之前,我们先来理解有关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 }

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

 

 

 

版权声明:程序员胖胖胖虎阿 发表于 2022年10月10日 下午8:00。
转载请注明:hibernate框架(3)---持久化对象 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...