关于会话的Hibernate问题

时间:2009-11-01 16:55:05

标签: java hibernate

我正在编写一个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();
        }
    }

}

有没有人对我该做什么有任何建议?如果您需要发布其他课程或文件以获取有关此计划的更多信息,请说明您的需求。

4 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

我的猜测是你在处理视图时得到了这个(jsp / velocity / jsf)。 请阅读Open Session in View文档,该文档彻底解释了问题。

答案 2 :(得分:1)

当您收到该错误时,您不在该代码中。

例如,findByUserName返回一个对象。 该对象与其他对象有连接,可能无法从数据库初始化。

  • 当会话打开时,如果您访问非获取的数据,则会在您访问数据时以静默方式触发数据库查询以获取数据。这是懒惰模式
  • 一旦退出方法,会话就会关闭。任何访问延迟数据的尝试都会触发您提到的异常。

在您的示例中,虽然您认为只有上述代码与数据库进行通信,但可能存在外部访问。针对您的问题的两种解决方案:

  • 使用其他答案中解释的 Open-Session-In-View 模式。请注意,它们是与之相关的几个重要缺点,因此您必须仔细权衡选项。
  • 确保在业务代码将实体传递到Presentation层之前获取所需的所有数据。这是我们最近三个应用程序一直使用的方法。

答案 3 :(得分:1)

如果您在项目中使用Spring,请尝试 OpenSessionInViewInterceptor