异常: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>