0
我正在處理一些舊的應用程序代碼,並且似乎涉及到幾個概念,所以我期待確保我可以將它們改進爲一個實體嚴格的練習。hibernate transaction begin/rollback/commit vs. session.clear()
基本上,整個代碼是包裹着這樣
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();
}
}
然後,HibernateSessionRequestFilter,有一個攔截器,做這樣的事情
private String loadStaff(...) {
//...
try {
dbSession = //...;
dbSession.beginTransaction();
// some logic
dbSession.getTransaction().rollback();
} catch (RuntimeException e) {
//..
}
finally {
if (dbSession != null && dbSession.isOpen()) {
dbSession.clear();
}
}
}
然後有更多的業務邏輯代碼與一些更begind交流和會話清除等
所以,問題:
- beginTransaction在同一會話上多次調用會發生什麼?
- 有時,調用「clear()」會拋出異常,我認爲它發生在「rollback()」被調用之後。如何解決這個問題?
- 一般來說,將session.clear()與transaction begin/rollback/commit結合起來最好的做法是什麼?
謝謝
爲什麼你首先要清除會話?你認爲它有什麼作用?爲什麼回滾事務,而不是提交?你認爲它有什麼作用?讓你閱讀這些方法的javadoc,以及[beginTransaction的javadoc](https://docs.jboss.org/hibernate/orm/5.1/javadocs/org/hibernate/SharedSessionContract.html#beginTransaction--),它* *確實**說當在同一個會話中多次調用它時會發生什麼。您是否閱讀了https://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/Hibernate_User_Guide.html#transactions-api,它解釋瞭如何使用事務? –