如下错误:org.hibernate.LazyInitializationException: could not initialize proxy - no Session
原因是懒加载的问题,因为hibernate的机制是当我们查询一个对象的时候,在默认情况下,返回的只是该对象的普通属性,当用户去使用对象属性的时候,才会向数据库再一次查询,可以这时session已经关闭了,无法对数据库进行查询。
举例:在界面显示雇员所在的部门名称${loginuser.department.name }
解决方法:(强烈推荐方法三和方法四,如果是简单解决可以采用方法一)
方法一:修改对象关系文件,在Department.hbm.xml中做如下修改:
<class name="Department" lazy="false" table="department">
方法二:不推荐。显示初始化,在获取Employee的地方,添加:
Hibernate.initialize(employee.getDept());
方法三:openSessionView,也就是说扩大session的作用范围(这种方法不适合引入spring的时候)
不做处理前,session的作用范围,仅仅在service处调用开始,service处结束。可以使用过滤器,扩大session的作用范围,让他在整个过程都可以起作用
public class MyFilter1 extends HttpServlet implements Filter { public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { Session session = null; Transaction transaction = null; try { session = HibernateUtil.getCurrentSession(); transaction = session.beginTransaction(); arg2.doFilter(arg0, arg1); // 这是在所有的请求往回返的时候,才会提交 transaction.commit(); } catch (Exception e) { if (transaction != null) { transaction.rollback(); } throw new RuntimeException(e.getMessage()); }finally{ //不能使用常规的关闭 HibernateUtil.closeCurrentSession(); } } public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } }
方法四:
时间: 2024-10-13 01:40:01