could not initialize proxy - no Session错误
报错出现情况
使用struts+hibernate+springMVC时,使用标准查询Criteria进行联级查询抛出此错误
//学生实体类
public class Student {
private Integer id;
private String name;
private String password;
//班级对象 和学生一对多关系
private Classes classes = new Classes();
//课程集合 和学生多对多关系
private Set<Course> courses = new HashSet<Course>();
}
//dao层方法:标准查询会自动查出学生所在班级和所选课程
public List<Student> getList() {
return getCurrentSession().createCriteria(Student.class).list();
}
原因分析(个人理解)
- spring的配置文件配置了自动管理事务
- 所以在查询完学生表中的数据时,Hibernate会去自动查询关联的其他俩表的数据(班 级和课程信息)
- 查询都是依靠session对象执行的。
- 但是查完学生表,spring的事务管理会自动将session关闭。
- 所以导致后俩个操作无法完成,缺少session。
- 故报异常could not initialize proxy - no Session(无法初始化代理对象-没有session)
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<!-- 配置线程绑定的Session
factory.openSession : 开启事务/操作/提交事务/关闭session
getCurrentSession : 获取一个和线程绑定的Session,不需要自己去开启/提交数据,线程结束之后,自动关闭session -->
<!-- CurrentSession相当于之前的session后者模板对象,作用都是操作数据库当中的数据的,基本都是增删该查 -->
<prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop>
</props>
</property>
<!-- 配置事务 -->
<bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 使用Spring的注解来开启事务 -->
<tx:annotation-driven transaction-manager="txManager"/>
业务处理层注解方式添加了spring自动管理事务
@Transactional
@Service("xkService")
public class XkService {
省略具体内容
}
解决办法
在web.xml中配置用于开启事务的过滤器
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>