Hibernate - 无法获取当前线程的事务同步会话

时间:2016-08-25 02:13:06

标签: java hibernate transactions hibernate-session

我理解这个问题已被问过很多次,但大多数都无法解释我的问题:

@RequestMapping("/testing")
public String testing(HttpServletRequest request, final ModelMap model) 
{
    Transaction ut = session.openSession().beginTransaction();

    session.getCurrentSession(); // error here

    ut.commit();

    return "testing";
}

为什么我收到错误

Could not obtain transaction-synchronized Session for current thread.

如果我用@Transactional注释方法,它的工作完全正常。因为我在春天的背景下有@EnableTransactionManagement

我想尝试一些事情来理解getCurrentSessionopenSession之间的区别,所以我在上面创建了测试用例。

在活动的Transaction上下文中调用

getCurrentSession,为什么它仍然会让我犯错误???

请参阅this中的代码。

1 个答案:

答案 0 :(得分:0)

好的,经过这么长时间的研究,我发现我错过了下面的paragraph

  

您不会在常规应用程序中看到这些代码段;致命   (系统)异常应始终在" top"中捕获。其他   单词,在持久性中执行Hibernate调用的代码   layer,以及处理RuntimeException的代码(通常可以   只清理和退出),在不同的层。目前的背景   Hibernate的管理可以大大简化这种设计   访问SessionFactory。异常处理将在后面讨论   本章。

所以显示那里的例子确实不会在常规场景中工作......

我必须做如下:

// BMT idiom with getCurrentSession()
try {
    UserTransaction tx = (UserTransaction)new InitialContext()
                            .lookup("java:comp/UserTransaction");

    tx.begin();

    // Do some work on Session bound to transaction
    factory.getCurrentSession().load(...);
    factory.getCurrentSession().persist(...);

    tx.commit();
}
catch (RuntimeException e) {
    tx.rollback();
    throw e; // or display error message
}

这意味着,getCurrentSession的使用受到很大限制,必须在active(和特定)交易中运行。