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的更多相关文章

  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. ASIHTTPRequest实现https双向认证请求

    什么是双向认证呢?简而言之,就是服务器端对请求它的客户端要进行身份验证,客户端对自己所请求的服务器也会做身份验证.服务端一旦验证到请求自己的客户端为不可信任的,服务端就拒绝继续通信.客户端如果发现服务 ...

  2. 通往成功的钥匙--Web前端开发技术

    互联网是一个服务性行业,用户对网站良好的体验度,直接影响到网站的效果.无论你做了多少广告推广,没有用户体验度等于零.Web前端技术是为了解决用户体验度而诞生的.无论是百度.新浪.阿里巴巴等大型网站,还 ...

  3. 由一个Servlet 看java入门常犯的几个错误

    安装完java环境后,cmd-javac 报错           ------------->环境变量配错了,最后全配成系统变量,ok了 能浪费一天的时间 写一个最简单的Servlet ,to ...

  4. fakeLoader.js-针对WebApp中的 “假”预加载

    在做移动端网站的时候,前端有时候需要一些过渡效果,当然我们肯定首先想到肯定是用css3做一个过渡动画,nice,那我给大家一个好用的jQuery插件吧,让你三行代码实现这种过渡动画效果. 1.由于该插 ...

  5. Jboss消息 异常

    org.jboss.mq.SpyJMSException: Could not update message: 1 msg=13 hard STORED PERSISTENT queue=QUEUE. ...

  6. Win7 OpenCV 3.0.0 VS2013 环境配置

    参考资料:http://jingyan.baidu.com/article/75ab0bcbee4b47d6864db2fc.html 注: x86 x64 这些根据自己的系统以及需求而定, 这里就不 ...

  7. Aws api gateway Domain name

    Set Up a Custom Domain Name for an API Gateway API The following procedure describes how to set up a ...

  8. 在centos安装docker

    关闭防火墙 iptables -L systemctl disable firewalld.service systemctl stop firewalld.service 配置代理太麻烦了,建议使用 ...

  9. ios-XML文档解析之SAX解析

    首先SAX解析xml *xml文档的格式特点是节点,大体思路是把每个最小的子节点作为对象的属性,每个最小子节点的'父'节点作为对象,将节点转化为对象,输出. 每个节点都是成对存在的,有开始有结束.有始 ...

  10. ORA-19693: 已包括备份片段

    使用rman异机恢复数据时,报"ORA-19693: 已包括备份片段..."错误. 执行的rman命令: RMAN> run{ 2> allocate channel ...