5

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

我能想到的最好方法是使用动作组合,在其中我创建自己的Action类似对象来启动事务,将代码块包装在 中Action,评估它并保存结果,提交或回滚事务,然后返回结果。

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

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

托德

4

2 回答 2

2

如果它是一个更好的选择,我不知道,但您也可以使用动作组合而不是通过继承创建子类。

基本上,你可以这样写:

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)
}
于 2013-06-08T18:27:21.543 回答
0

我不确定是否有最佳实践。我期待着阅读其他人的答案。

这个页面应该告诉你如何做你想做的事。基本上在 Global 中,您要么扩展 WithFilters,要么覆盖 doFilter。您仍然只是包装动作,但您是从一个中心位置进行的。

现在,这是否比按照这里的建议进行动作组合更好,我不知道。

于 2013-06-08T17:52:59.463 回答