Reputation: 2015
I am handling some old application code, and there seems to be several concepts involved, so I am looking to make sure I can improve them into one solid and strict practice.
Basically, the whole code is wrapped with a HibernateSessionRequestFilter like this
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();
}
}
Then, there is an interceptor, doing something like this
private String loadStaff(...) {
//...
try {
dbSession = //...;
dbSession.beginTransaction();
// some logic
dbSession.getTransaction().rollback();
} catch (RuntimeException e) {
//..
}
finally {
if (dbSession != null && dbSession.isOpen()) {
dbSession.clear();
}
}
}
And then there is even more business logic code with some more begintransactions and session clear etc.
So, questions:
Thank you
Upvotes: 0
Views: 2773
Reputation: 761
Your code should look like this and this is way to handle the transaction for the single http request,
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
try {
// Open the transaction.
sf.getCurrentSession().beginTransaction();
// Handle the request
chain.doFilter(request, response);
// Persist the db changes into database.
sf.getCurrentSession().commit();
} catch (...) {
// Somthing gone wrong while handling the http request so we should remove all the changes and rollback the changes that are done in the current request.
sf.getCurrentSession().rollback()
} finally {
sf.getCurrentSession().close();
}
}
In other parts of your code should not handle the begintransaction/close/commit the transaction. It should be handled by in one place only.
Upvotes: 1