在显示映射的2个表的结果后,应该在哪里关闭Hibernate会话对象?

时间:2017-05-03 07:15:06

标签: java hibernate jsp

我有proxy initialisation-no session error并且我已经发现它是由于关闭了Hibernate会话对象,然后返回包含要显示的所有记录的Iterator。
我有2张桌子:

Emp {
  eid int Primary Key,
  ename String,<br>
  did int (Foreign Key to Dept table);
}

Dept {
  did int,
  dname String;
}

我使用Netbeans Reverse Engineering向导创建了POJO个类。现在我有show.jsp,它显示记录并有一个RegisterEmp.java,它包含一个方法public Iterator<Emp> getListOfUsers()来获取所有这些记录,显示在show.jsp上。

方法如下:

   public Iterator<Emp> getListOfUsers(){
    List<Emp> list = null;
    Iterator<Emp> listIterator = null;
    try {
        sf = DbUtil.getSf(); //getting SessionFactory obj from DbUtil class
        s = sf.openSession(); //s is a session object
        Query query=s.createQuery("from Emp");            
        list=query.list();
        listIterator=list.iterator();
    } catch (Exception e) {
        System.out.println(e);
    } finally {
        //s.close(); //I figured this is giving me proxy initialisation- no session error
    }
    return listIterator;
}

show.jsp的代码是:

<%@ page import="data.*, business.*"%>
<%@ page import ="java.util.*" %>

<!DOCTYPE html>
<html>
<head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

     <title>Result Page</title>
</head>
<body>
<center>
     <div id="container">
         <h1>Result Page</h1>

         <table border="2">
             <thead>
                 <tr>
                     <th>Emp ID</th>
                     <th>Emp Name</th>
                     <th>Department</th>
                     <th>Update Record</th>
                 </tr>
             </thead>
             <tbody>
                 <%
                     int eid;
                     String ename, dept; 
                     RegisterEmp loginService = new RegisterEmp();
                     Iterator<Emp> itr = loginService.getListOfUsers();
                     while(itr.hasNext())
                     {
                        Emp e=(Emp)itr.next();
                        Dept d=e.getDept();
                        //out.println("  "+e.getEname()+ "  ");
                        //out.println("  "+d.getDname() + "  ");
                        eid = e.getEid();
                        ename = e.getEname();
                        dept = d.getDname();

                 %>
                 <tr>
                     <td><%=eid%></td>
                     <td><%=ename%></td>
                     <td><%=dept%></td>
                     <td><a href="updateviewform.jsp?id=<%=eid%>&ename=<%=ename%>&dept=<%=dept%>">Update</a></td>
                 </tr>
                 <%}%>
             <tbody>
         </table>    
         <br/>
     </div>
    </center>
</body>
</html>

由于show.jsp可以访问HttpSession对象而不是Hibernate Session的对象,所以我也无法在这里关闭Hibernate会话对象。

我可以在哪里关闭它?

1 个答案:

答案 0 :(得分:1)

我仍然会在服务方法中关闭它,以防止任何有关会话保持打开的问题。

在仍处于会话环境中时,急切地获取所需的依赖项:

Query query=s.createQuery("select e from Emp e inner join fetch e.dept");