我理解这个问题已被问过很多次,但大多数都无法解释我的问题:
@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
。
我想尝试一些事情来理解getCurrentSession
和openSession
之间的区别,所以我在上面创建了测试用例。
getCurrentSession
,为什么它仍然会让我犯错误???
请参阅this中的代码。
答案 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
(和特定)交易中运行。