从Hibernate获取后台线程的新会话

时间:2010-02-25 20:59:40

标签: java hibernate web-applications websphere

我正在开发一个Web应用程序。通常在请求开始时(通过体系结构代码),打开Hibernate会话以处理数据库事务。在请求结束时,会话将关闭。这适用于我们的所有事务,除了在一个特定实例中,我想从请求中触发一个线程。该线程将调用DB事务。

从线程中,我调用“sessionFactory.openSession()”,并在此会话中执行我的事务。问题出现在请求完成时,线程本身可能不一定完成。因此,当请求完成并且线程尝试执行另一个DB事务时,我得到一个Hibernate会话已关闭!错误。

无论如何,从我的帖子中,我可以打开一个“干净”的会话,与请求开始时打开的会话无关?

2 个答案:

答案 0 :(得分:1)

您可以创建一个扩展HibernateAccessor的线程服务,作为spring.xml定义的独立Spring服务,并向其发送您要处理的代码/数据。像这样:

    Session session = SessionFactoryUtils.getSession(
            getSessionFactory(), getEntityInterceptor(), getJdbcExceptionTranslator());
    SessionHolder sessionHolder = null;
    try {
        applyFlushMode(session, false);
        sessionHolder = new SessionHolder(session);
        TransactionSynchronizationManager.bindResource(getSessionFactory(), sessionHolder);
        Transaction t = getSessionFactory().getCurrentSession().beginTransaction();
        try {

            //execute your code here

            t.commit();
        } catch (Exception e) {
            t.rollback();
            log.error("Error", e);
        }
        try {
            flushIfNecessary(sessionHolder.getSession(), false);
        }
        catch (HibernateException ex) {
            throw convertHibernateAccessException(ex);
        }
    } finally {
        SessionFactoryUtils.closeSession(sessionHolder.getSession());
        TransactionSynchronizationManager.unbindResource(getSessionFactory());
    }

答案 1 :(得分:0)

您可以使用JPA Entity Manager手动开始和提交事务。 Here is my extended answer