使用HibernateTemplate发生LazyInitiallizationException的解决

使用HibernateTemplate发生LazyInitiallizationException的解决
2007年11月29日 星期四 13:34

使用Hibernate整合Spring,经常用到Spring对Hibernate进行了封装的一个类HibernateTemplate,此模板类中几乎包含了常用的方法,我现在说的是使用其中的一个简单的方法时遇到的问题及如何解决。
正在装载数据……

以下代码是一个简单的使用hibernateTemplate通过ID加载User的例子:

package com.lideedu.yame;

import org.hibernate.SessionFactory;
import org.springframework.orm.
hibernate3.HibernateTemplate;

public class UserDAO implements IUserDAO ...{
private HibernateTemplate hibernateTemplate;

public void setSessionFactory(
SessionFactory sessionFactory) ...{
hibernateTemplate =
new HibernateTemplate(sessionFactory);
}

public void insert(User user) ...{
hibernateTemplate.save(user);
}

public User find(Integer id) ...{
User user = (User) hibernateTemplate.load(User.class, id);
System.out.println(user.getUserName);
return user;
}
}

 

注意:到上面调用的是hibernateTemplate的load()方法,执行上面那段代码将会抛出LazyInitiallizationException异常

这是因为HibernateTemplate的load()方法,将会用到session对象的load()方法,这将会使用Hibernate3默认的延迟加载功能,但HibernateTemplate执行完load()方法之后,会直接关闭session,所以在session关闭后再尝试去取User的属性,将会抛出异常LazyInitiallizationException

解决方法有三个:

1、改用HibernateTemplate的get()方法

2、实现HibernateCallback接口,并将实例传入给HibernateTemplate的execute()方法

..........
public User find(final Integer id)...{
User user = (User)hibernateTemplate.execute (
new HibernateCallback() ...{
public Object doInHibernate(Session session) throws HibernateException,SQLException ...{
User user = (User)session.load(User.class,id);
Hibernate.initialize(user);
return user;
}
});

return user;

}

 

 

在doInHibernate()方法的实现中,主动使用Hibernate.initialize()方法初始化User对象的属性。

3、直接在Hibernate的 .hbm.xml中设置"lazy"属性为"false",表示不使用延迟加载功能

<hibernate-mapping>

<class name="com.lideedu.yame.User"
table="user" lazy="false">

<id name="id" column="id">
<generator class="native"/>
</id>

<property name="name" column="name"/>

<property name="age" column="age"/>

</class>

</hibernate-mapping>

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值