diff --git a/src/main/scala/net/liftmodules/transaction/TransactionContext.scala b/src/main/scala/net/liftmodules/transaction/TransactionContext.scala index 399a273..e5e4dda 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. */ @@ -122,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
*/
@@ -168,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
@@ -178,6 +203,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