学Hibernate报:Exception in thread "main" org.hibernate.LazyInitializationException: could not initiali

异常:Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - no Session

这是因为session已经关闭。


java:代码

String hql = "from Studcourse where course.cid=?";
String[] params = {21+""};

List<Studcourse> studcourses = new HibernateHelper().executeQuery(hql, params);

for (Studcourse studcourse : studcourses) {
  System.out.println(studcourse.getStudent().getSname());
}


有两张解决方式:

1.(1)在student.hbm.xml(也就是one)中配置

 <class name="com.ht.domain.Student" lazy="false" table="STUDENT" schema="SCOTT">

明确告诉hibernate框架:如果session没有就创建一个session,完成查询任务

(或者)

(2)<many-to-one> & <set> 中设置 lazy="false" 

这两种虽都 解决了大部分的延时加载问题 ,但是同事也降低了系统的性能 不建议哈...


初学者可以使用强两种方式解决问题,但在实际开发中,使用的是第三种...

取消lazy,不要在one-to-many中one的一方的<set/>配置,可以在many中配置



2.显示初始化代理对象:

比如要查找的是emp表 雇员的部门名字

可以在session开启后,加上一条:

Hibernate.initialize(emp.getDept());

这条语句的作用是:跟emp对象绑定的dept对象也一起返回...



上面两种方式是不好的,因为再后来dept使不使用,它都会发出sql语句


3.通过openSessionInview来解决懒加载(思想就是扩大session的范围)

建立一个Filter过滤器,doFilter()方法中添加如下代码,以后使用的session都是是getCurrentSession();

session = HibernateUtil.getCurrentSession();
tx = session.beginTransaction();

chain.doFilter(servletRequest, servletResponse);

tx.commit();


4.整合ssh后,spring专门提供openSessionInView的方法来解决懒加载,需要在web.xml中添加如下配置

<filter>
           <filter-name>openSessionInViewFilter</filter-name>
           <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>

<filter-mapping>
          <filter-name>openSessionInViewFilter</filter-name>
            <url-pattern>/*</url-pattern>
</filter-mapping>




你可能感兴趣的:(Hibernate,Hibernate,session,session,session)