Hibernate的load()和get()区别
最近在用Hibernate的时候发现一个问题:比如我们从数据库获得一个对象时,使用session.get()方法还是session.load()? 两种方法在获得一个实体对象时是有区别的,在查询性能上两者是不同的。
一.获得实体对象的不同
// load方法
public student GetStudentBystudo(String studo){
student stu = null;
Session session = getSession();
if(session != null){
try{
// get如果没有查询到数据,则返回null
// stu = (Student) session.get(Student.class, stuNo);
stu = (student) session.load(student.class, studo);// load如果没有查询到数据,则抛出异常 }catch(HibernateException e){
e.printStackTrace();
}finally{
session.close();
}
}
load方法是懒加载,,即:当我们使用session.load()方法来加载一个对象时,此时并不会发出sql语句,当前得到的这个对象其实是一个代理对象,这个代理对象只保存了实体对象的id值,只有当我们要使用这个对象,得到其它属性时,这个时候才会发出sql语句,从数据库中去查询我们的对象。
这就造成在实际的运行中,如果想要获得id之外的值会报错.
1.可以获得id


2.获取这个对象的其他值会报错


这里的原因在上面已经说了,session.load()不会发出SQL语句,且只会得到对象的一个id值.
相比之下session.get()方法就比较直接,当我们使用session.get()方法来得到一个对象时,不管我们使不使用这个对象,此时都会发出sql语句去从数据库中查询出来.
所以二者比较:session.load():①性能好不会发出SQL语句,但是如果查id之外的值会报错.②报错可控 不会出现NULL
session.get():①不管你用不用这个对象都会发出SQL语句,所以性能差,但是可以查对象的所有值. ②报错不可控 查不到对象的话 会报NULL.
最后建议:使用createSQLQuery接口,一般的业务逻辑都可以满足. 完美!
Hibernate的load()和get()区别的更多相关文章
- Hibernate中get方法和load方法的区别
		一.get和load方法都是根据id去获得对应数据的,但是获得机制不同:如果使用get方法,hibernate会去确认该id对应的数据是否存在,它首先会去session中去查询(session缓存其实 ... 
- hibernate中load,get;find,iterator;merge,saveOrUpdate,lock的区别
		hibernate中load,get;find,iterator;merge,saveOrUpdate,lock的区别 转自http://www.blogjava.net/bnlovebn/archi ... 
- Hibernate的load和get方法的区别
		这次我们聊一下Hibernate3.2 Session加载数据时get和load方法的区别,我总结的如下: 1. 对于get方法,hibernate会确认一下该id对应的数据是否存在,首先在sessi ... 
- Hibernate 中 load() 和 get() 的区别
		get 和 load 方式都是是根据 id 取得一个记录.下边详细说一下 get 和 load 的不同,因为有些时候为了对比也会把 find 加进来. 1.从返回结果上对比: load 方式检索不到的 ... 
- hiberante中get和load方法的区别
		1.从返回结果上对比: load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常 get方法检索不到的话会返回null 2.从检索执行机制上对比: ... 
- about hibernate lazy load and solution
		about hibernate lazy load is that used when loaded again.it can increase efficienty and sava memory. ... 
- Hibernate框架之get和load方法的区别
		我们在学习Hibernate框架时,经常会进行修改,删除操作,对于这些操作,我们都应该先加载对象,然后在执行或删除的操作,那么这里Hibernate提供了两种方法按照主键加载对象,也就是我要说的get ... 
- Hibernate 关于load和get方法区别
		load和个体方法都可以充分利用内部缓存和二级缓存中的现有数据. ******************************************************************* ... 
- Hibernate中load与get,update与merge方法的区别
		1.load()与get()的区别: (1)load()读取 User user = (User)session.load(User.class, userId); (2)get()读取 User u ... 
随机推荐
- 如何将FastReportOnlineDesign 灵活的应用到C/S B/S 程序当中?
			一.好久没有写博客了,主要是停在这里太久了,有些事情让自己尽量不在去想,忘记不了一段难以忘怀的记忆,就让这一段美好的记忆沉没在无锡的太湖中吧!不在去想了.难以忘怀..... 二.废话不多说了,不如正题 ... 
- C#操纵Excel,此工作薄包含嵌入对象,Office 2007的设定方法
			C#操纵Excel,插入OLE对象时报“此工作薄包含嵌入对象,EXCEL可能无法从这些对象中删除个人信息.”, 如网上所述,Office 2003可以通过“菜单>>工具>>选项 ... 
- JavaScript数据可视化编程学习(一)Flotr2,包含简单的,柱状图,折线图,饼图,散点图
			一.基础柱状图 二.基础的折线图 三.基础的饼图 四.基础的散点图 一.基础柱状图 如果你还没有想好你的数据用什么类型的图表来展示你的数据,你应该首先考虑是否可以做成柱状图.柱状图可以表示数据的变化过 ... 
- Python之random
			random 伪随机数生成模块.如果不提供seed,默认使用系统时间. 使用相同seed,可获得相同的随机数序列,常用于测试. >>> from random import * &g ... 
- Docker(社区版) centos版 安装
			1,总结一下docker的安装,其实官网有很全面的资料了,可以自己上面去看,但都是英文的. https://docs.docker.com/engine/installation/linux/dock ... 
- 使用asp.net mvc引擎开发插件系统
			一.前言 我心中的插件系统应该是像Nop那样(更牛逼的如Orchard,OSGI.NET),每个插件模块不只是一堆实现了某个业务接口的dll,然后采用反射或IOC技术来调用,而是一个完整的mvc小应用 ... 
- redis复制原理和应用
			1.前言 说到分布式高可用,必然少不了复制,一来是为了做个冗余备份防止数据丢失,二来还可以达到分流来提高性能的目的.基本架构: 下面用M表示Master(主服务器),S表示Slave(从服务器),话不 ... 
- linux centos ubentu安装IPython四种方法
			IPython是Python的交互式Shell,提供了代码自动补完,自动缩进,高亮显示,执行Shell命令等非常有用的特性.特别是它的代码补完功能,例如:在输入zlib.之后按下Tab键,IPytho ... 
- 【原创】python实现清理本地缓存垃圾
			#coding=utf-8 import os import glob try: #利用glob模块定位需要清理垃圾的模糊路径 File_1 = glob.glob("C:\Windows\ ... 
- Java语句语法
			一.流程控制语句 1.分支语句 1)if else 语法:(写法1) if(条件1){ //写一次 满足条件1执行在代码 }else if(条件2){ //写0或n次 不满足条件1,满足 ... 
