论坛首页 入门技术论坛

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

浏览 2802 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-07-09  
网上有许多关于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.classnew 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。
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics