hibernate里load方法和get方法的区别比较
最近项目中用到hibernate,出现的问题更是重重,所以不得不去研究下hibernate里load方法和get方法的区别,网站找了下资料,觉得有点帮助,在这里分享了一下罢:
以下摘自:http://chillwarmoon.iteye.com/blog/99440
网上有许多关于load和get方法的讨论,自己做了一个小小的实验,明确一下load和get方法的工作原理。
首先get方法没有什么可说的,就是在Session执行此函数的时候hit一下数据库,而load方法比较麻烦,具体的执行流程是这样的:
- Session session=getSessionFactory().openSession();
- Transaction tr=session.beginTransaction();
- //Student stu2=(Student)session.get(Student.class, new Integer(5));
- //if(session.contains(stu2)) System.out.println("stu2 in the session");
- Student stu=(Student)session.load(Student.class, new Integer(5));
- stu.getAddress();
- tr.commit();
- 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。
» 本文链接:https://blog.apires.cn/archives/339.html
» 转载请注明来源:Java地带
» 《hibernate里load方法和get方法的区别比较》
» 本文章为Java地带整理创作,欢迎转载!转载请注明本文地址,谢谢!
» 部分内容收集整理自网络,如有侵权请联系我删除!
» 订阅本站:https://blog.apires.cn/feed/