我有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会话对象。
我可以在哪里关闭它?
答案 0 :(得分:1)
我仍然会在服务方法中关闭它,以防止任何有关会话保持打开的问题。
在仍处于会话环境中时,急切地获取所需的依赖项:
Query query=s.createQuery("select e from Emp e inner join fetch e.dept");