博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Hibernate里load方法和get方法的区别

Posted on 2010-07-09 10:54  记录  阅读(457)  评论(0编辑  收藏  举报

网上有许多关于load和get方法的讨论,自己做了一个小小的实验,明确一下load和get方法的工作原理。
首先get方法没有什么可说的,就是在Session执行此函数的时候hit一下数据库,而load方法比较麻烦,具体的执行流程是这样的:

java 代码

  1. Session session=getSessionFactory().openSession();  
  2. Transaction tr=session.beginTransaction();  
  3. //Student stu2=(Student)session.get(Student.class, new Integer(5));
  4. //if(session.contains(stu2)) System.out.println("stu2 in the session");
  5. Student stu=(Student)session.load(Student.class, new Integer(5));  
  6. stu.getAddress();  
  7. tr.commit();  
  8. session.close(); 

(1)查找Session所在的persistent Context中是否有缓存的persistent object,如果有则直接返回该persistent object作为stu对象;如果没有,则需要建立代理对象,该代理对象不是我们认为的pojo,其中的代理对象的initialized属性为 false,target属性为null。
(2)在访问获得的代理对象的属性时,例如执行stu.getArress()时,因为此时的persistent Context中没有该persistent object,所以会hit数据库。
(3)hit数据库时,如果在数据库中找到该对象对应的记录,那么用获得的对象赋值给该代理对象的target属性,并且将initialized属性改为true;如果在数据库中找不到该对象对应的记录,那么抛出org.hibernate.ObjectNotFoundException异常。
而get方法每次执行都hit数据库,如果没有相对应的记录,那么就返回null。