【发布时间】:2016-04-04 18:07:13
【问题描述】:
我正在处理一些旧的应用程序代码,并且似乎涉及到几个概念,所以我希望确保我可以将它们改进为一种扎实而严格的实践。
基本上,整个代码都用这样的 HibernateSessionRequestFilter 包装
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
try {
sf.getCurrentSession().beginTransaction();
chain.doFilter(request, response);
sf.getCurrentSession().clear();
} catch (...) {
//...
} finally {
sf.getCurrentSession().close();
}
}
然后,有一个拦截器,做这样的事情
private String loadStaff(...) {
//...
try {
dbSession = //...;
dbSession.beginTransaction();
// some logic
dbSession.getTransaction().rollback();
} catch (RuntimeException e) {
//..
}
finally {
if (dbSession != null && dbSession.isOpen()) {
dbSession.clear();
}
}
}
然后还有更多的业务逻辑代码,包括更多的 begintransactions 和 session clear 等。
所以,问题:
- 在同一会话中多次调用 beginTransaction 会发生什么?
- 有时,调用“clear()”会引发异常,我认为它发生在调用“rollback()”之后。如何解决?
- 一般而言,将 session.clear() 与事务开始/回滚/提交结合起来的最佳建议做法是什么?
谢谢
【问题讨论】:
-
为什么首先要清除会话?你认为它有什么作用?为什么你回滚事务,而不是提交它?你认为它有什么作用?请阅读这些方法的 javadoc,以及javadoc of beginTransaction,它确实说明了在同一会话中多次调用它时会发生什么。你读过docs.jboss.org/hibernate/orm/5.1/userguide/html_single/…,它解释了如何使用事务吗?
标签: java sql database hibernate transactions