hibernate延迟加载

本文深入探讨Hibernate中的延迟加载策略,包括其默认行为、如何配置及使用场景。通过具体示例说明了不同检索策略的特点,帮助开发者更好地理解并利用这些特性提升应用程序的性能。
在hibernate应用中,有时候只访问指定的持久化对象,在加载该对象时没有必要加载其关联的对象,以免浪费内存空间,但若想在Session关闭后正常访问该对象,必须在加载该对象时,一起加载该对象的关联对象,为了满足检索持久化对象的不同情况的需求,开发灵活高效的hibernate应用,hibernate提供的三种检索策略:立即检索、延迟检索(加载)和迫切连接检索。
在hibernate 3中为了提高效率、节省内存,默认的加载模式是延迟加载,也就是说没有在ORM配置文件中显示指定lazy参数的参数的话,laze的默认值是true,hibernate将默认为延迟加载,例如:有2个持久化对象:TTask和Tusers
其中TUsers是TTask的一个多对一的关联对象,TTask.hbm.xml中配置内容为:
<many-to-one name="TUsersByUserId" class="DAO.TUsers" fetch="select">
<column name="user_id" length="20" />
</many-to-one>

测试程序段:
public void test(){
Session session=HibernateSessionFactory.getSession();
Query q=session.createQuery("from TTask");
List list=q.list(); (1)
HibernateSessionFactory.closeSession();
for(int i=0;i<list.size();i++){
TTask t=(TTask)list.get(i);
System.out.println(t.getTUsersByCarryId().getUsername());(2)
}
}
会造成如下异常:
Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - no Session

……
这是因为在运行到(1)出的时候没有查询TTask的关联对象TUser,之后Session关闭, 运行到(2)处时,由于session关闭,所以就抛出了异常。
延迟加载作为hibernate默认检索策略,所谓延迟加载就是在等到访问的时候才装载和初始化指定的对象,如果在Session实例关闭之前没有初始化延迟检索出来的对象session实例关闭后再访问时,就会抛出异常,因此在访问指定的对象前应确保该对象被成功实例化。
延迟加载主要可以用在:
Hibernate3.x,lazy默认是打开的
Hibernate Lazy策略使用:
<class>标签,可以取值true/false
<property>标签,可以取值true/false
<set><list>标签,可以取值true/false/extra
<one-to-one> <many-to-one>单端关联,可以取值:false/proxy/noproxy
load支持lazy,get不支持,无论持久化类设置与否,都会立即检索。
(1)class标签
<class name="className" lazy="true/alse">
默认为true
class上的Lazy,只对普通属性起作用,对集合和<one-to-one> <many-to-one>不起作用
即:如果一个类里有Set集合成员变量和需要用<one-to-one> <many-to-one>来映射的成员变量,即使在class里设置lazy为false,他们在使用之前也不会加载。需要单独设置lazy,也就是lazy的另外两个用法。
如果在使用load加载了某个对象,但是没有使用,即没有发出SQL语句,就把session给关了,此时,如果再使用这个对象就会抛出LazyInitalizationException。因为对象并没有加载上来,因为使用了lazy策略,只是加载了类的一个代理子类。
(2)集合
<set name="name" lazy="true/false/extra" >
默认为true
默认为true情况下,只要使用到了Set对象,就会把整个set全部查询出来。
false情况下,不使用Lazy,查询Lazy所属的对象时,set就会被查询上来。需要类增强工具。
extra情况下,比较智能,根据查询的内容,生成不同的SQL语句。效率会高一些。
(3)单端关联
<many-to-one name="name" lazy="false/proxy/noproxy">
默认为proxy
false:不使用Lazy。
noproxy:需要类增强工具
(4)property
<property name="name" lazy="true/false"/>
默认false
true:较少使用,如果某个字段是内容量比较大,可以设置为true,在真正使用的时候再加载。可以提高效率。
数据驱动的两阶段分布鲁棒(1-范数和∞-范数约束)的电热综合能源系统研究(Matlab代码实现)内容概要:本文围绕“数据驱动的两阶段分布鲁棒(1-范数和∞-范数约束)的电热综合能源系统研究”展开,提出了一种结合数据驱动与分布鲁棒优化方法的建模框架,用于解决电热综合能源系统在不确定性环境下的优化调度问题。研究采用两阶段优化结构,第一阶段进行预决策,第二阶段根据实际场景进行调整,通过引入1-范数和∞-范数约束来构建不确定集,有效刻画风电、负荷等不确定性变量的波动特性,提升模型的鲁棒性和实用性。文中提供了完整的Matlab代码实现,便于读者复现和验证算法性能,并结合具体案例分析了不同约束条件下系统运行的经济性与可靠性。; 适合人群:具备一定电力系统、优化理论和Matlab编程基础的研究生、科研人员及工程技术人员,尤其适合从事综合能源系统、鲁棒优化、不确定性建模等相关领域研究的专业人士。; 使用场景及目标:①掌握数据驱动的分布鲁棒优化方法在综合能源系统中的应用;②理解1-范数和∞-范数在构建不确定集中的作用与差异;③学习两阶段鲁棒优化模型的建模思路与Matlab实现技巧,用于科研复现、论文写作或工程项目建模。; 阅读建议:建议读者结合提供的Matlab代码逐段理解算法实现细节,重点关注不确定集构建、两阶段模型结构设计及求解器调用方式,同时可尝试更换数据或调整约束参数以加深对模型鲁棒性的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值