如何简单的理解延迟加载?开发中常见的org.hibernate.LazyInitializationException no session错误又是怎么产生的?下面通过一个简单的例子来解析一下。

load VS. get

    load是Hibernate利用延迟加载获取对象的方法,当调用load时返回的是一个代理对象,并且该对象只包含主键ID。只有当你想主动获取该对象的其他非主键属性时,才会去数据库中获取对应的属性返回。如果这时该对象对应的数据库记录被删除了或不存在则会报抛出ObjectNotFoundException异常。

    get是Hibernate获取对象的一个普通方法,没有使用延迟加载,调用get时hibernate直接返回数据库中对应的记录信息。如果数据库中不存在该对象的记录,会抛出空指针异常。

程序所示

load:

   1:  Session session = null;
   2:          try {
   3:              session = HibernateUtil.openSession();
   4:              //使用load,利用延迟加载获取对象其他属性
   5:              Object object = session.load(Member.class, 121L);
   6:              String mobile = ((Member) object).getMobile();//<---这里当调用getMobile()时,才会去数据库查询对应的记录
   7:              System.out.println(mobile);
   8:          } catch (HibernateException e) {
   9:              e.printStackTrace();
  10:          } finally {
  11:              if (session != null)
  12:                  session.close();
  13:          }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

get:

   1:  Session session = null;
   2:          try {
   3:              session = HibernateUtil.openSession();
   4:              //使用get,直接从数据库中查询对应的记录
   5:              Object object = session.get(Member.class, 121L);
   6:              String mobile = ((Member) object).getMobile();//<---这里没有使用延迟加载直接获取mobile
   7:              System.out.println(mobile);
   8:          } catch (HibernateException e) {
   9:              e.printStackTrace();
  10:          } finally {
  11:              if (session != null)
  12:                  session.close();
  13:          }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

使用延迟加载时,常见的org.hibernate.LazyInitializationException no session异常,又是怎么产生的呢?

这是因为当使用延迟加载获取对象属性时如果这时session已经关闭,则无法进行数据库操作,就会报出上述异常,我们用程序模拟一下:

get:

   1:  Session session = null;
   2:          try {
   3:              session = HibernateUtil.openSession();
   4:              //使用get,直接从数据库中查询对应的记录
   5:              Object object = session.get(Member.class, 121L);
   6:              session.close();//这时关闭session
   7:              String mobile = ((Member) object).getMobile();//可以正常获取,因为mobile是从对象中直接获取的
   8:              System.out.println(mobile);
   9:          } catch (HibernateException e) {
  10:              e.printStackTrace();
  11:          } 

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

load:

   1:  Session session = null;
   2:          try {
   3:              session = HibernateUtil.openSession();
   4:              //使用get,直接从数据库中查询对应的记录
   5:              Object object = session.load(Member.class, 121L);
   6:              session.close();//这时关闭session
   7:              String mobile = ((Member) object).getMobile();//使用load的情况,获取mobile是从数据库中查询的,但此时session已经关闭,故调用getMobile时会抛出org.hibernate.LazyInitializationException no session异常
   8:              System.out.println(mobile);
   9:          } catch (HibernateException e) {
  10:              e.printStackTrace();
  11:          } 

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

Hibernate 延迟加载原理的更多相关文章

  1. Hibernate学习--hibernate延迟加载原理(动态代理)

    在正式说hibernate延迟加载时,先说说一个比较奇怪的现象吧:hibernate中,在many-to-one时,如果我们设置了延迟加载,会发现我们在eclipse的调试框中查看one对应对象时,它 ...

  2. Hibernate学习--hibernate延迟加载原理-动态代理(阿里电面)

    在正式说hibernate延迟加载时,先说说一个比较奇怪的现象吧:hibernate中,在many-to-one时,如果我们设置了延迟加载,会发现我们在eclipse的调试框中查看one对应对象时,它 ...

  3. JAVA Hibernate工作原理及为什么要用

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

  4. Hibernate工作原理及为什么要用?

    Hibernate工作原理及为什么要用? 原理:1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件2.由hibernate.cfg.x ...

  5. JAVA Hibernate工作原理及为什么要用(转)

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

  6. Hibernate 延迟加载 分析

    出处:http://www.ibm.com/developerworks/cn/java/j-lo-hibernatelazy/#icomments Hibernate 的延迟加载(lazy load ...

  7. hibernate工作原理及作用

    转载自 http://www.cnblogs.com/dashi/p/3597969.html#commentform JAVA Hibernate工作原理及为什么要用 hibernate 简介:hi ...

  8. [转]Hibernate延迟加载与opensessioninviewFilter

    原文地址:http://blog.csdn.net/a19881029/article/details/7916702 hibernate延迟加载: 一个person对应多个school,使用hibe ...

  9. Hibernate缓存原理与策略

    Hibernate缓存原理: 对于Hibernate这类ORM而言,缓存显的尤为重要,它是持久层性能提升的关键.简单来讲Hibernate就是对JDBC进行封装,以实现内部状态的管理,OR关系的映射等 ...

随机推荐

  1. Dapper完美兼容Oracle,执行存储过程,并返回结果集。

    Dapper完美兼容Oracle,执行存储过程,并返回结果集. 这个问题,困扰了我整整两天. 刚刚用到Dapper的时候,感觉非常牛掰.特别是配合.net 4.0新特性dynamic,让我生成泛型集合 ...

  2. 【Hawk】入门教程(1)——从URL开始

    入门教程(1)--从URL开始 首先感谢辛苦的沙漠君 先把沙漠君的教程载过来:)可以先看一遍 Hawk-数据抓取工具:简明教程 Hawk 数据抓取工具 使用说明(二) 20分钟无编程抓取大众点评17万 ...

  3. myeclipse 无法启动

    1.对项目中的一个文件重新命名,导致卡死,结束myeclipse进程不管用,重启不管用. 删除工程下的文件  以  .markers.snap 和  marker开头的两个文件   位置: 工作空间\ ...

  4. iOS 传值方式

    1.代理传值 2.AppDelegate传值 3.block传值 4.通知传值 5.NSUserDefault传值

  5. webpack 使用教程--实时刷新测试

    学习webpack,基本始终是围绕: 1.如何安装webpack 2.如何使用webpack 3.如何使用loader 4.如何使用开发服务器 可能我们会在如何使用开发服务器的时候,遇到诸如调试的相关 ...

  6. MongoDB数据库安装与连接

  7. Linux下添加apache虚拟主机

    一切在确保apache被正确安装的前提下 设置虚拟主机 创建虚拟目录 现在,让我们继续安装虚拟主机.虚拟主机命名为local.gis. 创建一个公用的文件夹来存放这虚拟主机的数据. 首先,让我们为lo ...

  8. 软件工程:黄金G点小游戏1.0

    我们要做的是黄金G点小游戏: N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值. ...

  9. 基于synchronized 或 ReadWriteLock实现 简单缓存机制

    package cn.xxx.xxx; import java.util.HashMap; import java.util.Map; import java.util.concurrent.lock ...

  10. Android开发学习路线图

    Android开发学习方法: Android是一个比较庞大的体系,从底层的Linux内核到上层的应用层,各部分的内容跨度也比较大.因此,一个好的学习方法对我们学习Android开发很重要. 在此建议, ...