在Play 2 Scala中处理交易的传统方式是什么?

时间:2013-06-08 16:43:39

标签: database scala playframework playframework-2.0

我在Play 2.1 Scala项目中使用JDO进行数据存储。理想情况下,我希望每个请求都有自己的事务,在完成时提交,如果出现问题则回滚。

我可以想出这样做的最好方法是使用Action Composition,我在其中创建自己的Action - 类似对象来启动事务,将代码块包装在Action中,进行评估它并保存结果,提交或回滚事务,然后返回结果。

我唯一担心的是,我的整个项目现在由DbAction而不是常规Action组成。我不确定为什么这会让我感到担心,除了我认为必须有一个更好的地方来做这件事。但是,当我检查GlobalSettings中可用的钩子时,看起来没有任何效果。

我应该选择DbAction并停止自我猜测,还是有一个地方可以将这种行为挂钩,以便我可以使用Action

托德

2 个答案:

答案 0 :(得分:2)

如果它是更好的选择,我不会这样做,但您也可以使用Action Composition而不是通过继承创建子类。

基本上,你可以这样写:

def TransactionalAction(f: Request[AnyContent] => Result): Action[AnyContent] = {
  Action { request =>
    startTransaction
    try {
        f(request)
        commit
    } catch {
        case e: Exception => rollback
    }

  }
}

然后使用:

def index = TransactionalAction { request =>
  val something = someQueriesInDB
  Ok(something)
}

答案 1 :(得分:0)

我不确定是否有最好的做法。我期待着阅读其他人的答案。

This page应该告诉你如何做你想做的事。基本上在Global中,您可以扩展WithFilters或覆盖doFilter。你仍然只是把动作包裹起来,但你是从一个中心位置做的。

现在,我不知道这是一个比建议here所做的动作组合更好的想法,我不知道。