[转]Hibernate中Session的get和load

时间:2021-10-02 01:26:25

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);
[转]Hibernate中Session的get和load
 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 }
[转]Hibernate中Session的get和load

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

[转]Hibernate中Session的get和load

load

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

public void load(Object object, Serializable id);
[转]Hibernate中Session的get和load
 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 }
[转]Hibernate中Session的get和load

get和load的区别

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

[转]Hibernate中Session的get和load
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 }
[转]Hibernate中Session的get和load

[转]Hibernate中Session的get和load[转]Hibernate中Session的get和load

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

[转]Hibernate中Session的get和load
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 }
[转]Hibernate中Session的get和load

[转]Hibernate中Session的get和load

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

②查询数据库中不存在的数据时,get方法返回null,load方法抛出异常:org.hibernate.ObjectNotFoundException。

[转]Hibernate中Session的get和load

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

[转]Hibernate中Session的get和load
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 }
[转]Hibernate中Session的get和load

[转]Hibernate中Session的get和load

结果印证了:调用load方法返回的是代理对象,代理对象中只保存了id,只有在获取非主键属性时,才会发出sql语句;因为没有执行sql语句,所以没有抛出ObjectNotFoundException异常。

关于延迟加载和缓存

上面的测试结果都是因为hibernate3以后默认启用了延迟加载:lazy="true",get方法不使用延迟加载机制,首先查找Session缓存,然后查找二级缓存,然后查询数据库(hibernate3以前会跳过二级缓存,直接查询数据库)。load方法首先查找Session缓存,然后查找二级缓存,若找不到则返回代理对象,延迟到真正使用对象非主键属性时才发出sql语句加载对象。

若设置lazy="false",load返回代理对象之后会发出sql语句,若找不到符合条件的记录,依然会抛出ObjectNotFoundException异常。

[转]Hibernate中Session的get和load的更多相关文章

  1. Hibernate中Session的get和load

    hibernate中Session接口提供的get()和load()方法都是用来获取一个实体对象,在使用方式和查询性能上有一些区别.测试版本:hibernate 4.2.0. get Session接 ...

  2. Hibernate中Session之get和load方法的真正区别

    最近在学习SHH框架中的hibernate,对Session的get和load方法,有点混不清楚,不知道区别在哪,或者对它们的区别感触不深.所以百度了一下,结果问题来了.百度的结果和实际测试的结果出入 ...

  3. Hibernate中Session.get()方法和load()方法的详细比较

    一.get方法和load方法的简易理解  (1)get()方法直接返回实体类,如果查不到数据则返回null.load()会返回一个实体代理对象(当前这个对象可以自动转化为实体对象),但当代理对象被调用 ...

  4. hibernate中session的get和load方法的区别和联系:

    1. get:及时加载,调用到get方法时立即向数据库查询(在没有session缓存的请况). 2. load:默认使用懒加载,当用到数据的时候才向数据库查询(在没有session缓存的请况). 3. ...

  5. hibernate中session

    hibernate中的session是一级缓存,可以理解为进程级的缓存.在进程运行期间一直存在. session可以理解为一个可以操作数据库的对象 具体如何操作数据库? session中有方法, 如果 ...

  6. Hibernate的Session的get()和load()方法区别

    hibernate中Session接口提供的get()和load()方法都是用来获取一个实体对象,在使用方式和查询性能上有一些区别. get Session接口提供了4个重载的get方法,分别通过“持 ...

  7. hibernate中session的获取使用以及其他注意事项

    hibernate中session的获取使用以及其他注意事项 前言:工作时,在同时使用Hibernate的getSession().getHibernateTemplate()获取Session后进行 ...

  8. Hibernate中Session与本地线程绑定

    ------------------siwuxie095 Hibernate 中 Session 与本地线程绑定 1.Session 类似于 JDBC 的连接 Connection 2.Session ...

  9. Hibernate中Session.get()/load()之区别

    原文链接http://sunxin1001.iteye.com/blog/292090 Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象.其区 ...

随机推荐

  1. Java实现上传下载

    一.上传 二.下载 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.Fi ...

  2. 再次用CodeIgniter实现简易blog

    天变冷了,人也变得懒了不少,由于工作的需要,最近一直在学习CodeIgniter(CI)框架的使用,没有系统的从PHP基本语法学起,在网上靠百度谷歌,东拼西凑的实现了一些简单的功能.所以,老PHPer ...

  3. 服务器租用中网络ping值过高的原因

    其实在网络ping值过程中常常会有很多情况影响这个ping值问题,包括丢包现象,不稳定等等.究竟ping值的大小传输速度与哪些问题有关呢?是什么原因会影响他的速度呢?16年服务器租用运营经验的上市ID ...

  4. 关于ubuntu下词典安装

    圣诞快乐!merry xmas! 身为程序猿和研究僧,英文文献是经常接触的,所以在ubuntu下当然需要一款英汉词典啦 查了下推荐stardict的比较多,于是学着安装了下,感觉还不错,但是只有词典功 ...

  5. ARM流水线关键技术分析与代码优化

    引 言    流水线技术通 过多个功能部件并行工作来缩短程序执行时间,提高处理器核的效率和吞吐率,从而成为微处理器设计中最为重要的技术之一.ARM7处理器核使用了典型三级流 水线的冯·诺伊曼结构,AR ...

  6. session marked for kill处理oracle中杀不掉的锁

    ora-00031:session marked for kill处理oracle中杀不掉的锁   一些ORACLE中的进程被杀掉后,状态被置为"killed",但是锁定的资源很长 ...

  7. CSS3动画效果之animation

    先解决上一篇的遗留问题. div { width: 300px; height: 200px; background-color: red; -webkit-animation: test1 2s; ...

  8. pytest 15 fixture之autouse=True

    前言 平常写自动化用例会写一些前置的fixture操作,用例需要用到就直接传该函数的参数名称就行了.当用例很多的时候,每次都传这个参数,会比较麻烦.fixture里面有个参数autouse,默认是Fa ...

  9. ASPOSE.Word 开发资料整理

    1.总体说明:操作主要涉及两个对象Document及DocumentBuilder Document主要用来获取文档中的节点,DocumentBuilder主要用于实现文档内容的写入 doc_Oper ...

  10. RabbitMQ使用介绍及实例

    消息列队不做过多解释了,直接讲讲rabbitmq的基本概念和路由模式. 一.安装及基本概念 rabbitmq是基于erlang编写的,所以安装rabbitmq之前需要安装erlang的环境,配置环境变 ...