我正在编写一个Web应用程序,允许用户获取员工的个人信息并对其进行编辑(电子邮件,电话,姓名等)。当我在服务器上部署应用程序时,如果我尝试编辑该员工,我偶尔会收到错误消息“Hibernate会话已经关闭”。我通过hibernate与数据库通信的代码如下:
/*
* File: EmployeeMapper.java
*/
package org.hibernate.employee;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
/**
* This class represents the data mapper for an employee to the
* database.
*/
public class EmployeeMapper {
/**
* Constructs an EmployeeMapper object.
*/
public EmployeeMapper() {
}
/**
* Finds an employee in the database by the username specified.
*
* @param username the username to find
* @return the employee if the username is in the database, null otherwise
*/
public Employee findByUserName(String username) {
Session session = SessionFactoryUtil.getInstance().getCurrentSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
Query q = session.createQuery("from Employee e where e.username='"
+ username + "'");
List results = q.list();
for (Object o : results) {
Employee e = (Employee) o;
return e;
}
} catch (RuntimeException e) {
e.printStackTrace();
} finally {
session.close();
}
return null;
}
/**
* Updates the employee in the database by writing it to the database.
*
* @param employee the employee to update in the database
* @throws Exception
*/
public void updateEmployee(Employee employee) {
Session session = SessionFactoryUtil.getInstance().getCurrentSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
session.update(employee);
session.getTransaction().commit();
} catch(RuntimeException e){
if(tx != null){
tx.rollback();
}
throw e;
} finally {
session.close();
}
}
}
有没有人对我该做什么有任何建议?如果您需要发布其他课程或文件以获取有关此计划的更多信息,请说明您的需求。
答案 0 :(得分:1)
答案 1 :(得分:1)
我的猜测是你在处理视图时得到了这个(jsp / velocity / jsf)。 请阅读Open Session in View文档,该文档彻底解释了问题。
答案 2 :(得分:1)
当您收到该错误时,您不在该代码中。
例如,findByUserName
返回一个对象。
该对象与其他对象有连接,可能无法从数据库初始化。
在您的示例中,虽然您认为只有上述代码与数据库进行通信,但可能存在外部访问。针对您的问题的两种解决方案:
答案 3 :(得分:1)
如果您在项目中使用Spring,请尝试 OpenSessionInViewInterceptor