could not initialize proxy - no Session

[size=medium]hbm.xml配置如下:
<class table="T_Orgnization" name="com.scriptguy.oa.model.Orgnization" >
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<property name="sn"/>
<property name="description"/>
<many-to-one lazy="false" column="pid" name="parent"/>
<set [b][color=red]lazy="false" [/color][/b]inverse="true" name="children">
<key column="pid"/>
<one-to-many class="com.scriptguy.oa.model.Orgnization"/>
</set>
</class>
DAO的实现(继承自HibernateDaoSupport):
public class OrgManagerImpl extends HibernateDaoSupport implements OrgManager {

public Orgnization findOrg(int orgId) {
// Session session = (Session)this.getHibernateTemplate().getSessionFactory().openSession();
// Orgnization org = (Orgnization)session.load(Orgnization.class, new Integer(orgId));
// System.out.print(org.getDescription());
// session.close();
// return org;
return (Orgnization)this.getHibernateTemplate().load(Orgnization.class, orgId);
}


}
那么我在客户端调用这个DAO的findOrg(int orgId) 时,得到的只是一个Orgnization的代理类,hibernate并没有发出sql语句,出现org.hibernate.LazyInitializationException,提示could not initialize proxy - no Session。

导致异常的原因:
使用HibernateTemplate的save、load等方法时,它的Session管理策略是:打开session,进行相关操作,默认使用lazy加载结果,不会发出sql语句,返回的是代理类
然后关闭session,此时你得到了一个Orgnization的代理类,如果你要调用Orgnization实例的getter方法,那么它就会去实际加载Orgnization对象,发出sql语句,可此时session已经关闭,因此会抛出异常,提示ould not initialize proxy - no Session。

解决方案:
一、使用OpenSessionInView
[color=red][b]在web.xml中添加过滤器,代码如下:
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
</filter
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>[/b][/color]
二、更改查询策略:
<class table="T_Orgnization" name="com.scriptguy.oa.model.Orgnization" lazy="false">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<property name="sn"/>
<property name="description"/>
<many-to-one column="pid" name="parent"/>
<set lazy="true" inverse="true" name="children">
<key column="pid"/>
<one-to-many class="com.scriptguy.oa.model.Orgnization"/>
</set>
</class>[/size]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值