From c87452dcd38db8dd5a6a69dbfcad5ae9f89bd454 Mon Sep 17 00:00:00 2001 From: Nicolas Vollmar Date: Tue, 27 May 2014 21:21:58 +0200 Subject: [PATCH 1/2] provide access to the ScalaEntityManager wrapper in addition to the plain old JPA EntityManager --- .../net/liftmodules/transaction/TransactionContext.scala | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/scala/net/liftmodules/transaction/TransactionContext.scala b/src/main/scala/net/liftmodules/transaction/TransactionContext.scala index 399a273..6a3c645 100644 --- a/src/main/scala/net/liftmodules/transaction/TransactionContext.scala +++ b/src/main/scala/net/liftmodules/transaction/TransactionContext.scala @@ -80,6 +80,11 @@ trait TransactionMonad { */ def getEntityManager: EntityManager = TransactionContext.getEntityManager + /** + * Returns the current EntityManager as ScalaEntityManager. + */ + def getScalaEntityManager: ScalaEntityManager = TransactionContext.getScalaEntityManager + /** * Checks if an EntityManager exists in current context. */ @@ -178,6 +183,8 @@ object TransactionContext extends TransactionProtocol with Loggable { private[transaction] def getEntityManager: EntityManager = current.getEntityManager + private[transaction] def getScalaEntityManager: ScalaEntityManager = current + private[transaction] def closeEntityManager = current.closeEntityManager private[this] def current = stack.value From d39df6c318eba0d464989caefcd815e1efa4494a Mon Sep 17 00:00:00 2001 From: Nicolas Vollmar Date: Tue, 27 May 2014 21:23:35 +0200 Subject: [PATCH 2/2] added higher order functions with current context --- .../transaction/TransactionContext.scala | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main/scala/net/liftmodules/transaction/TransactionContext.scala b/src/main/scala/net/liftmodules/transaction/TransactionContext.scala index 6a3c645..e5e4dda 100644 --- a/src/main/scala/net/liftmodules/transaction/TransactionContext.scala +++ b/src/main/scala/net/liftmodules/transaction/TransactionContext.scala @@ -127,6 +127,16 @@ trait TransactionMonad { * query.getSingleResult * } * + * Example usage 3: + *
+ * def findUserByName(name: String) = TransactionContext.required { ctx =>
+ *   // transactional stuff
+ *   ctx.getScalaentityManager
+ *      .createQuery[User]("select u from User u where u.name = :name")
+ *      .setParams("name" -> "fred")
+ *      .findOne
+ * }
+ * 
* * @author Jonas Bonér */ @@ -173,6 +183,16 @@ object TransactionContext extends TransactionProtocol with Loggable { override def filter(f: TransactionMonad => Boolean): TransactionMonad = this } + def required[T](body: TransactionMonad => T): T = for (ctx <- Required) yield { body(ctx) } + + def requiresNew[T](body: TransactionMonad => T): T = for (ctx <- RequiresNew) yield { body(ctx) } + + def supports[T](body: TransactionMonad => T): T = for (ctx <- Supports) yield { body(ctx) } + + def mandatory[T](body: TransactionMonad => T): T = for (ctx <- Mandatory) yield { body(ctx) } + + def never[T](body: => T): T = for (ctx <- Mandatory) yield { body } + private[transaction] def setRollbackOnly = current.setRollbackOnly private[transaction] def isRollbackOnly = current.isRollbackOnly