文档章节

load和get之Hibernate的延迟加载机制

secondriver
 secondriver
发布于 2015/09/17 09:24
字数 728
阅读 2
收藏 0

在Hibernate中:

如果你使用load方法,hibernate认为该id对应的对象(数据库记录)在数据库中是一定存在的,所 以它可以放心的使用,它可以放心的使用代理来延迟加载该对象。在用到对象中的其他属性数据时才查询数据库,但是万一数据库中不存在该记录,那没办法,只能抛异常

ObjectNotFoundException。

   下面是使用load查询对象的时候,对象不存在的情况下的Hibernate处理机制。

   


  
  1. public void testQuertNotExistByLoadMethod(){ 
  2.         Session session = null
  3.         Transaction tran = null
  4.         Person p =null
  5.         try
  6.             session = FactorySession.getSession(); 
  7.             tran = session.beginTransaction(); 
  8.             tran.begin(); 
  9.             //使用了lazy,只有在正真使用的时候才加载数据对象 
  10.             //Hibernate延迟加载采用的是代理方式 
  11.             p=(Person)session.load(Person.class"不存在"); 
  12.             System.out.println(p.getPerName()); 
  13.             session.save(p); 
  14.             tran.commit(); 
  15.         } catch (Exception e) { 
  16.             tran.rollback(); 
  17.         } finally { 
  18.             FactorySession.closeSession(session); 
  19.         } 
  20.     } 

下面是调试情况下的截图:


使用load加载数据的时候,这里的id="不存在"在数据库中并不存在数据,将会抛出异常。


当使用get方法的时候当查询的数据数据库不存在的时候将返回null.

下面是通过查询数据库已有的数据,然后修改持久化数据,查看代理类的状态。



  
  1. public void testQuertNotExist(){ 
  2.         Session session = null
  3.         Transaction tran = null
  4.         Person p =null
  5.         try
  6.             session = FactorySession.getSession(); 
  7.             tran = session.beginTransaction(); 
  8.             tran.begin(); 
  9.             //采用load方法,获得已有的对象,然后进行更新 
  10.             p=(Person)session.load(Person.class"8aab8c8538a101310138a10132190001"); 
  11.             System.out.println(p.toString()); 
  12.             p.setCreatTime(new Date()); 
  13.             session.save(p); 
  14.             tran.commit(); 
  15.         } catch (Exception e) { 
  16.             tran.rollback(); 
  17.         } finally { 
  18.             FactorySession.closeSession(session); 
  19.         } 
  20.     } 

Person类的对象p是存在的,当程序运行到 System.out.println(p.toString()); 的时候控制台输出


  
  1. Hibernate: select person0_.perId as perId0_0_, person0_.perNamee as perNamee0_0_, person0_.creatTime as creatTime0_0_ from ext.dbo.Person person0_ where person0_.perId=? 
  2. Person [creatTime=2012-07-20 06:14:21.173, perId=8aab8c8538a101310138a10132190001perName=孙悟空] 
查看运行过程的代理类的信息: 

       代理类的target目标下的信息和查询到的信息一相同的。当更新持久化对象p的创建时间的时候由于traget不为空,表示Session缓存中存在对象,而且此刻p对象仍然在接收着Session的管理,所以可以控制台中显示出有更新语句的产生。       当然如果没有查询到数据这里的traget自然就为空了。 

  
  1. Hibernate: select person0_.perId as perId0_0_, person0_.perNamee as perNamee0_0_, person0_.creatTime as creatTime0_0_ from ext.dbo.Person person0_ where person0_.perId=? 
  2. Person [creatTime=2012-07-20 06:15:58.167, perId=8aab8c8538a101310138a10132190001, perName=孙悟空] 
  3. Hibernate: update ext.dbo.Person set perNamee=?, creatTime=? where perId=? 
         get和load的根本区别:hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,就抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。load方法具有延迟加载的功能,而get方法没有。

本文出自 “野马红尘” 博客,谢绝转载!

© 著作权归作者所有

共有 人打赏支持
secondriver
粉丝 10
博文 229
码字总数 233821
作品 0
广州
程序员
私信 提问
Hibernate 中 get和load方法的区别

hibernate支持延迟加载,也称为懒加载,就是在使用对象的时候才会发送sql语句,不使用对象的时候就不会发送sql语句。只有在session打开状态下,懒加载才有效。 一、get和load在懒加载方面的区...

LYQ1990
2016/04/21
28
0
Hibernate之加载策略(延迟加载与即时加载)和抓取策略(fetch)

  假设现在有Book和Category两张表,表的关系为双向的一对多,表结构如下:   假设现在我想查询id为2的那本书的书名,使用session.get(...)方法: 1 Session session=HibernateUtil.getSessio...

冬至饮雪
2016/03/08
0
0
Hibernate中get和load的区别

作者博客@Stone原地址 在Hibernate中如果要从数据库中得到一个对象 两种方法 通过session.get()方法 通过session.load()方法 区别 load加载方式 当使用load方法来得到一个对象时,此时hiber...

1314Stone
2017/11/24
0
0
Hibernate工作原理及优势

hibernate 简介: hibernate是一个开源框架,它是对象关联关系映射的框架,它对JDBC做了轻量级的封装,而我们java程序员可以使用面向对象的思想来操纵数据库。 hibernate核心接口 session:负...

期待变强的菜鸟
2014/10/15
0
0
Hibernate get() load()区别

对于Hibernate get方法,Hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查询数据库,数据库中没有就返回null。这个相对比较简单,也...

偶尔诗文
2014/06/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Confluence 6 升级中的一些常见问题

升级的时候遇到了问题了吗? 如果你想尝试重新进行升级的话,你需要首先重新恢复老的备份。不要尝试再次对 Confluence 进行升级或者在升级失败后重新启动老的 Confluence。 在升级过程中的一...

honeymoose
今天
2
0
C++随笔(四)Nuget打包

首先把自己编译好的包全部准备到一个文件夹 像这样 接下来新建一个文本文档,后缀名叫.nuspec 填写内容 <?xml version="1.0"?><package xmlns="http://schemas.microsoft.com/packaging/201......

Pulsar-V
今天
2
0
再谈使用开源软件搭建数据分析平台

三年前,我写了这篇博客使用开源软件快速搭建数据分析平台, 当时收到了许多的反馈,有50个点赞和300+的收藏。到现在我还能收到一些关于dataplay2的问题。在过去的三年,开源社区和新技术的发...

naughty
今天
3
0
Python3的日期和时间

python 中处理日期时间数据通常使用datetime和time库 因为这两个库中的一些功能有些重复,所以,首先我们来比较一下这两个库的区别,这可以帮助我们在适当的情况下时候合适的库。 在Python文...

编程老陆
今天
2
0
分布式面试整理

并发和并行 并行是两个任务同时进行,而并发呢,则是一会做一个任务一会又切换做另一个任务。 临界区 临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用,但是每一次,只能有...

群星纪元
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部