一.hibernate 延迟加载深入研究:
拿一对多关系来说明:
在一对多关联关系中,多的一方通过外键来关联一的一方,在查询HQL语句中,要取出多的一方与之相关联的一的一方的OID,非常容易,可在取别的属性时会遇到困难!
例如:多方: 学生po 字段值 id ,name ,oid
一方:教室 po 字段值 id ,name
取出某个学生信息:(HQL)from Student stu where stu.id=?
显示信息: System.out.println("学生姓名:"+user.getName()+"教室ID "+user.getRoom().getOid()+"教室名称"+user.getRoom().getName());
这时将会出错:could not initialize proxy - the owning Session was closed
这是因为,在hibernate 机制中默认有延迟加载lazy=”true”也就是说他只取出与只维护关系的oid,别的属性在用到时才会去,据说省内存。可在上边,当关掉 session时,他将会变为游离态也就是只有一个id属性了,别的都还没去出来。
解决办法:1.该显示信息在事务关闭之前运行。
2.取消延迟加载,在classroom.Hbm.xml中对象配置文件中直接加入lazy=”false”
3.重新将只有id 的对象,通过load() /get()方法变为持久态.
二.get() /load()根本区别
看到许多书谈论这东东感觉还不如自己想想呢:
1)查询id 对应的数据时,如果没有找到get()将会返回null,而load() 将会发生object not found异常.
2)在延迟加载 : get()返回的是一个实际的类实例. 而load()方法找到后通过代理对象去延迟加载,当真正用到数据时才会查询数据库,在使用过程中如果出现问题,将会抛异常.
User user=(User)session.load(User.class,”1”); A 返回实体对象的代理类对象
System.out.println(user.getName()); B
注:在执行到A时user因为有延迟加载加载机制,他只得到id属性,在用到别的时在从数据库去查询,,这时在A B中间来一句session.close();那就会抛出could not initialize proxy - the owning Session was closed异常的.
(转载: Hibernate并没有发起对数据的查询,如果我们此时通过一些调试工具(比如JBuilder2005的Debug工具),观察此时user对象的内存快照,我们会惊奇的发现,此时返回的可能是User$EnhancerByCGLIB$$bede8986类型的对象,而且其属性为null,这是怎么回事?还记得前面我曾讲过session.load()方法,会返回实体对象的代理类对象,这里所返回的对象类型就是User对象的代理类对象。在 Hibernate中通过使用CGLIB,来实现动态构造一个目标对象的代理类对象,并且在代理类对象中包含目标对象的所有属性和方法,而且所有属性均被赋值为null。通过调试器显示的内存快照,我们可以看出此时真正的User对象,是包含在代理对象的CGLIB$CALBACK_0.target属性中,当代码运行到(2)处时,此时调用user.getName()方法,这时通过CGLIB赋予的回调机制,实际上调用 CGLIB$CALBACK_0.getName()方法,当调用该方法时,Hibernate会首先检查CGLIB$CALBACK_0.target 属性是否为null,如果不为空,则调用目标对象的getName方法,如果为空,则会发起数据库查询,生成类似这样的SQL语句:select * from user where >
这样,通过一个中间代理对象,Hibernate实现了实体的延迟加载,只有当用户真正发起获得实体对象属性的动作时,才真正会发起数据库查询操作。所以实体的延迟加载是用通过中间代理类完成的,所以只有session.load()方法才会利用实体延迟加载,因为只有session.load()方法才会返回实体类的代理类对象。)
User user=(User)session.get(User.class,”1”); A
System.out.println(user.getName()); B
注:在用get方式时,就可以取出来了,因为他直接得到实列对象而没用延迟加载机制!
这地方选择的时候一定要慎重,是用get() 还是 load();
3)get方法首先查询session缓存,没有的话查询二级缓存,最后查询数据库;反而load方法创建时首先查询session缓存,没有就创建代理,实际使用数据时才查询二级缓存和数据库。”这是从别的地方听说的
三. 对于延迟加载时,用到相关联的类实例时,在session之前可以显示的给予实例化,
Classroom room=(Classroom)session.load(Classroom.class, 1);
if(!Hibernate.isInitialized(room)){
Hibernate.initialize(room);
}
这时就从代理对象类中实例化了该对象.可以在session关闭之后,取出数据.
分享到:
相关推荐
### Hibernate延迟加载以及利用Spring #### 一、Hibernate延迟加载概念与原理 在理解Hibernate的延迟加载机制之前,我们首先需要了解什么是延迟加载。延迟加载(Lazy Loading)是一种设计模式,其核心思想是在真正...
在Java Web开发中,...通过学习和实践,你可以更好地掌握在JSP中应用Hibernate的延时加载,从而编写出更高效、健壮的Java Web应用。在实际开发中,应结合项目需求,灵活运用各种策略来解决延时加载带来的挑战。
主要介绍了Java的Hibernate框架中的缓存和延迟加载机制,Hibernate是注明的Java下SSH三大web开发框架之一,需要的朋友可以参考下
【延迟加载】是Hibernate框架中的一个重要机制,旨在优化性能,避免在不需要数据时就提前加载大量数据,从而减少不必要的数据库交互。延迟加载的核心思想是在真正需要数据时才执行加载操作,以此来提升程序效率。 ...
关于“Hibernate延迟加载_懒加载具体应用”,这是Hibernate的一个重要特性。当你声明一个实体的一对多或一对一关系为“懒加载”时,不会在获取主对象时立即加载关联对象,而是在第一次访问这些关联对象时才发起...
Hibernate延迟检索的原理 ##### 实体对象的延迟加载 实体对象的延迟加载是指当真正需要某个实体对象的数据时,才执行数据加载操作。在Hibernate中,可以通过在实体的映射配置文件中设置`lazy="true"`来启用实体...
在Web开发中,延迟加载常用于图像和脚本的处理。例如,当用户滚动页面时,只有进入视口的图片才会开始下载,这显著减少了初始页面加载时间,提高了用户体验。通过使用Intersection Observer API或JavaScript库,...
SSH框架是指Struts、Spring和Hibernate的组合,是Java Web开发中常见的三大框架。描述中强调了文档的全面性和准确性,意味着这个API文档可以解决开发过程中的很多难题。 **Hibernate核心知识点** 1. **对象关系...
在现代Java Web开发中,Spring、SpringMVC和Hibernate是三个非常重要的框架,它们共同构建了一个强大的、灵活的和高效的应用程序开发环境。基于Spring+SpringMVC+Hibernate的全注解开发,允许开发者摆脱传统的XML...
这里我们主要关注的是" Hibernate 框架",它是一款强大的ORM(对象关系映射)工具,广泛应用于Java Web开发中。 Hibernate框架是Java平台上的一个开源项目,它的核心功能在于提供了一种在Java应用中管理和持久化...
在实际开发中,开发者需要对Struts的MVC模式和Hibernate的ORM机制有深入理解,以便快速上手并解决可能出现的问题。 总之,Java Web开发中的Struts和Hibernate整合是一种常见的实践,它帮助开发者更高效地构建数据...
Spring 和 Hibernate 是目前 Java Web 开发中非常流行的两个框架,它们结合使用可以构建出高性能、高可用性的企业级应用。 #### 二、关键技术点解析 ##### 2.1 xDoclet 生成配置文件 xDoclet 是一个强大的工具,...
标题中的"web+hibernate包"表明这是一个与Web应用开发相关的压缩包,重点在于Hibernate框架的集成。Hibernate是一个开源的对象...此外,了解Hibernate的事件监听器、二級缓存、延迟加载等功能也是提升开发效率的关键。
在软件开发领域,特别是Java Web开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作,使开发者可以更专注于业务逻辑而不是数据库层面的细节。2016年版本的Hibernate在继承了其...
在实际项目中,Hibernate常用于构建基于Java的Web应用、企业级应用和服务端应用程序,它简化了数据库操作,提高了开发效率,并且与Spring等其他框架有良好的整合能力。 **压缩包子文件的文件名称列表:“hibernate-...
Spring框架的延迟加载和声明式事务处理是两个关键特性,它们极大地简化了企业级应用的开发。延迟加载允许在需要时才加载关联的对象,而声明式事务处理则使得事务管理更加自动化,无需在代码中显式处理。 在Spring与...
Spring 2.5 和 Hibernate 3.2 是两个在企业级Java应用开发中非常重要的框架。Spring 是一个全面的后端应用框架,提供依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)以及大量的集成支持。而Hibernate 则是...
13. **性能优化**:提供一些最佳实践和技巧,如批处理、延迟加载、预加载等,以提高Hibernate应用的性能。 14. **其他高级特性**:如CGLIB和JPA支持、JMX监控、动态模型等。 通过《Hibernate3 CHM格式中文》,...
SSH框架,全称为Spring、Struts和Hibernate,是Java Web开发中常见的三大开源框架的组合。这个框架集合提供了模型-视图-控制器(MVC)的设计模式,使得开发者能够更高效地构建动态网站和企业级应用程序。在这个组合...
DWR 是一种让 JavaScript 在浏览器中直接调用服务器端 Java 方法的技术,而 Hibernate 是一个流行的Java持久化框架,它支持对象关系映射(ORM)以及延迟加载(Lazy Loading)功能。 在描述中提到的问题是,当使用...