From 9320b6beb86fbcf9f590495daba2a7f04a918130 Mon Sep 17 00:00:00 2001 From: Athou Date: Wed, 13 Aug 2014 10:01:38 +0200 Subject: [PATCH] units of work can now be chained --- .../com/commafeed/backend/dao/UnitOfWork.java | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/commafeed/backend/dao/UnitOfWork.java b/src/main/java/com/commafeed/backend/dao/UnitOfWork.java index 27f8d347..4c6e0f33 100644 --- a/src/main/java/com/commafeed/backend/dao/UnitOfWork.java +++ b/src/main/java/com/commafeed/backend/dao/UnitOfWork.java @@ -16,24 +16,31 @@ public abstract class UnitOfWork { protected abstract T runInSession() throws Exception; public T run() { - final Session session = sessionFactory.openSession(); - if (ManagedSessionContext.hasBind(sessionFactory)) { - throw new IllegalStateException("Already in a unit of work!"); - } + boolean newSession = !ManagedSessionContext.hasBind(sessionFactory); + + final Session session = newSession ? sessionFactory.openSession() : sessionFactory.getCurrentSession(); T t = null; try { - ManagedSessionContext.bind(session); - session.beginTransaction(); + if (newSession) { + ManagedSessionContext.bind(session); + session.beginTransaction(); + } try { t = runInSession(); - commitTransaction(session); + if (newSession) { + commitTransaction(session); + } } catch (Exception e) { - rollbackTransaction(session); + if (newSession) { + rollbackTransaction(session); + } this. rethrow(e); } } finally { - session.close(); - ManagedSessionContext.unbind(sessionFactory); + if (newSession) { + session.close(); + ManagedSessionContext.unbind(sessionFactory); + } } return t; }