博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate 3.0 延迟加载的问题
阅读量:5961 次
发布时间:2019-06-19

本文共 1041 字,大约阅读时间需要 3 分钟。

在Hibernate 3.0 之后,引入了一个延迟加载的优化,可能在Session关闭的时候带来一定的问题。 当显示页面时提示Session is Closed的错误。

该问题主要可能由于在使用Hibernate时,开启了延迟加载特性。即在Hibernate 配置文件中加入了Lazy=true属性。一个简单的例子:

User 表                                 UserClass

userid      username     userclassid                                    userclassid             userclassname

 1      hi      1                                                     1                         star

当使用hibernate进行持久对象映射,在配置文件中设置default-lazy="true",则在Hibernate在进行数据存取时,并不是直接生成真正的User对象(含有UserClass实例),而只是生成一个cglib代理对象。而如果在逻辑业务代码执行的过程中,加入了session.close()时,而如果在将来的页面渲染时候需要用到userclass.userclassname时,需要去取真正的User对象中的Userclass属性,而此时session已经被上面的代码关闭掉了,所以执行之后界面返回session is closed 错误。

 

解决方法:

1.  在执行业务逻辑的块中,删除session.close()这句,但是这同样会带来不关闭数据库连接所带来的巨大的并联消耗。如果是没有使用HibernateTemplate的情况下,只需要简单的刷新几次页面,在查询数据库连接的数目时,将会带来数量上的急剧上升。

2.  在Hibernate配置文件上,取消Hibernate的延迟加载的功能。如果是在配置文件只需 lazy = "false"

    2.1   在class 上面设置时,只对普通的属性有效。无法对其中连接的子类起作用。

    2.2   在单项属性上面设置,此处 property="userclass" lazy="false"

3.  如果是HSQL语句进行存取的话,如果是上述情况可以使用 from User as user left outer join fetch user.userClass, 明确的进行即刻加载,而不是生成

代理对象。

转载于:https://www.cnblogs.com/papertigerv5/archive/2011/11/03/2234925.html

你可能感兴趣的文章
VC++深入详解学习笔记1
查看>>
安装配置discuz
查看>>
线程互互斥锁
查看>>
KVM虚拟机&openVSwitch杂记(1)
查看>>
win7下ActiveX注册错误0x80040200解决参考
查看>>
《.NET应用架构设计:原则、模式与实践》新书博客--试读-1.1-正确认识软件架构...
查看>>
2013 Linux领域年终盘点
查看>>
linux学习之查看程序端口占用情况
查看>>
相逢在栀枝花开的季节
查看>>
linux下git自动补全命令
查看>>
Ubuntu14.04LTS更新源
查看>>
Linux报“Unknown HZ value! (288) Assume 100”错误
查看>>
mysql多实例实例化数据库
查看>>
我的友情链接
查看>>
golang xml和json的解析与生成
查看>>
javascript 操作DOM元素样式
查看>>
Android 内存管理 &Memory Leak & OOM 分析
查看>>
【查找算法】基于存储的查找算法(哈希查找)
查看>>
JavaWeb网上图书商城完整项目--day02-10.提交注册表单功能之页面实现
查看>>
做程序开发的你如果经常用Redis,这些问题肯定会遇到
查看>>