could not initialize proxy

来源:互联网 发布:英语哪个软件好 编辑:程序博客网 时间:2024/06/10 00:42
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 lazy="false" 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
在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>

二、更改查询策略:
  <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>
0 0
原创粉丝点击