[转]Hibernate中Session的get和load
hibernate中Session接口提供的get()和load()方法都是用来获取一个实体对象,在使用方式和查询性能上有一些区别。测试版本:hibernate 4.2.0。
get
Session接口提供了4个重载的get方法,分别通过“持久类+主键”和“全类名+主键”以及“锁选项”来获取实体对象。
public Object get(Class clazz, Serializable id);
public Object get(Class clazz, Serializable id, LockOptions lockOptions); public Object get(String entityName, Serializable id);
public Object get(String entityName, Serializable id, LockOptions lockOptions);

1 @Test
2 public void testGet() throws Exception {
3 Session session = sessionFactory.openSession();
4
5 Student student = (Student) session.get(Student.class, 1L);
6 // Student student = (Student) session.get("com.lt.crm.entity.Student", 1L);
7 System.out.println(student);
8
9 session.close();
10 }

向数据库发出一条sql查询语句,并返回结果。

load
load跟get调用方式基本一样,多了一个重载方法:使用“一个空的持久化类的实例+主键”来获取实体对象。
public void load(Object object, Serializable id);

1 @Test
2 public void testLoad() throws Exception {
3 Session session = sessionFactory.openSession();
4
5 Student student = new Student();
6 session.load(student, 1L);
7 System.out.println(student);
8
9 session.close();
10 }

get和load的区别
分别注释掉打印语句,即只是获取了对象,没有使用该对象。可以看到get方法发出了sql语句,而load方法没有发出sql语句。

1 @Test
2 public void testGet() throws Exception {
3 Session session = sessionFactory.openSession();
4
5 Student student = (Student) session.get(Student.class, 1L);
6 // System.out.println(student);
7 session.close();
8 }



分别将打印代码放在session关闭之后,load方法抛出异常:org.hibernate.LazyInitializationException。

1 @Test
2 public void testLoad() throws Exception {
3 Session session = sessionFactory.openSession();
4
5 Student student = (Student) session.load(Student.class, 1L);
6 session.close();
7 System.out.println(student);
8 }


①get方法会在调用之后立即向数据库发出sql语句(不考虑缓存的情况下),返回持久化对象;而load方法会在调用后返回一个代理对象,该代理对象只保存了实体对象的id,直到使用对象的非主键属性时才会发出sql语句。
②查询数据库中不存在的数据时,get方法返回null,load方法抛出异常:org.hibernate.ObjectNotFoundException。

如果我们使用load方法查询数据库中不存在的数据,且在session关闭之后,获取对象的id属性,结果会怎样呢?

1 @Test
2 public void testLoad() throws Exception {
3 Session session = sessionFactory.openSession();
4
5 Student student = (Student) session.load(Student.class, 4L);
6 session.close();
7 System.out.println(student.getId());
8 }


结果印证了:调用load方法返回的是代理对象,代理对象中只保存了id,只有在获取非主键属性时,才会发出sql语句;因为没有执行sql语句,所以没有抛出ObjectNotFoundException异常。
关于延迟加载和缓存
上面的测试结果都是因为hibernate3以后默认启用了延迟加载:lazy="true",get方法不使用延迟加载机制,首先查找Session缓存,然后查找二级缓存,然后查询数据库(hibernate3以前会跳过二级缓存,直接查询数据库)。load方法首先查找Session缓存,然后查找二级缓存,若找不到则返回代理对象,延迟到真正使用对象非主键属性时才发出sql语句加载对象。
若设置lazy="false",load返回代理对象之后会发出sql语句,若找不到符合条件的记录,依然会抛出ObjectNotFoundException异常。
[转]Hibernate中Session的get和load的更多相关文章
- Hibernate中Session的get和load
hibernate中Session接口提供的get()和load()方法都是用来获取一个实体对象,在使用方式和查询性能上有一些区别.测试版本:hibernate 4.2.0. get Session接 ...
- Hibernate中Session之get和load方法的真正区别
最近在学习SHH框架中的hibernate,对Session的get和load方法,有点混不清楚,不知道区别在哪,或者对它们的区别感触不深.所以百度了一下,结果问题来了.百度的结果和实际测试的结果出入 ...
- Hibernate中Session.get()方法和load()方法的详细比较
一.get方法和load方法的简易理解 (1)get()方法直接返回实体类,如果查不到数据则返回null.load()会返回一个实体代理对象(当前这个对象可以自动转化为实体对象),但当代理对象被调用 ...
- hibernate中session的get和load方法的区别和联系:
1. get:及时加载,调用到get方法时立即向数据库查询(在没有session缓存的请况). 2. load:默认使用懒加载,当用到数据的时候才向数据库查询(在没有session缓存的请况). 3. ...
- hibernate中session
hibernate中的session是一级缓存,可以理解为进程级的缓存.在进程运行期间一直存在. session可以理解为一个可以操作数据库的对象 具体如何操作数据库? session中有方法, 如果 ...
- Hibernate的Session的get()和load()方法区别
hibernate中Session接口提供的get()和load()方法都是用来获取一个实体对象,在使用方式和查询性能上有一些区别. get Session接口提供了4个重载的get方法,分别通过“持 ...
- hibernate中session的获取使用以及其他注意事项
hibernate中session的获取使用以及其他注意事项 前言:工作时,在同时使用Hibernate的getSession().getHibernateTemplate()获取Session后进行 ...
- Hibernate中Session与本地线程绑定
------------------siwuxie095 Hibernate 中 Session 与本地线程绑定 1.Session 类似于 JDBC 的连接 Connection 2.Session ...
- Hibernate中Session.get()/load()之区别
原文链接http://sunxin1001.iteye.com/blog/292090 Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象.其区 ...
随机推荐
- Python标准库笔记(4) — collections模块
这个模块提供几个非常有用的Python容器类型 1.容器 名称 功能描述 OrderedDict 保持了key插入顺序的dict namedtuple 生成可以使用名字来访问元素内容的tuple子类 ...
- Linux-进程间通信(六): 记录锁
1. 记录锁:记录锁的功能是,当一个进程正在读或者修改文件的某个部分的时候,它可以阻止其他进程修改同一文件区: 2. fcntl记录锁: #include <fcntl.h> int fc ...
- 内存分配器memblock【转】
转自:http://blog.csdn.net/kickxxx/article/details/54710243 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 背景 Data ...
- java===编译引用第三方文件的类(原创)
http://blog.csdn.net/m53931422/article/details/42174609 http://blog.csdn.net/u012450329/article/deta ...
- centos_7.1.1503_src_3
http://vault.centos.org/7.1.1503/os/Source/SPackages/ kdf-4.10.5-3.el7.src.rpm 05-Jul-2014 13:28 161 ...
- 利用BeanUtils工具类封装表单数据
一.BeanUtils工具类的使用 1.首先导入BeanUtils工具类的jar包 commons-beanutils-1.8.0.jar commons-logging-1.1.1.jar 2.se ...
- MySQL关键字大全
转载自:https://blog.csdn.net/benxiaohai888/article/details/77803090 在使用MySQL的时候,一般尽量避免用关键字作为表名,如使用关键字做表 ...
- git 查看父分支
// 显示本地分支和服务器分支的映射关系 git branch -vv // 切换分支(和创建分支就差一个-b参数) git checkout {{branch_name}} // 创建新分支,新分支 ...
- git 查看远程分支 $ git branch -a
查看远程分支 加上-a参数可以查看远程分支,远程分支会用红色表示出来(如果你开了颜色支持的话): 1 2 3 4 5 6 7 8 9 10 $ git branch -a master remote ...
- 小程序 image跟view标签上下会有空隙
解决方案 就是可以在image那里设置vertical-align:top/bottom/text-top/text-bottom 原因:图片文字等inline元素默许是跟父级元素的baseline对 ...