Database 什么';在Play 2 Scala中,处理事务的传统方式是什么?

Database 什么';在Play 2 Scala中,处理事务的传统方式是什么?,database,scala,playframework,playframework-2.0,Database,Scala,Playframework,Playframework 2.0,我在Play 2.1 Scala项目中使用JDO进行数据存储。理想情况下,我希望每个请求都有自己的事务,在完成时提交,如果出现问题则回滚 我能想出的最好的方法是使用Action Composition,在这里我创建自己的类似于Action的对象来启动事务,将代码块包装在Action中,对其求值并保存结果,提交或回滚事务,然后返回结果 我唯一关心的是,我的整个项目现在由DbActions组成,而不是常规的Actions。我不知道为什么这会让我担心,只是我认为一定有更好的地方来做这件事。但是,当我检

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

我能想出的最好的方法是使用Action Composition,在这里我创建自己的类似于
Action
的对象来启动事务,将代码块包装在
Action
中,对其求值并保存结果,提交或回滚事务,然后返回结果

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

我是否应该只使用
DbAction
并停止对自己的事后猜测,或者是否有一个地方可以将这种行为挂钩,这样我就可以使用
Action


托德

我不确定这方面是否有最佳实践。我期待着阅读别人的答案

应该告诉你如何做你想做的事。基本上,在全局中,您可以使用过滤器进行扩展,也可以覆盖doFilter。你仍然只是在包装动作,但你是从一个中心位置来做的


现在,我不知道这是否是一个比按照建议执行操作compsoion更好的主意。

我不知道这是否是一个更好的选择,但您也可以使用,而不是通过继承创建子类

基本上,你可以这样写:

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)
}

哼!我指的是动作合成,不是延伸。感觉就像我在扩展
操作
,但实际上我只是在包装它。我将编辑我的问题以使其清晰。不,对不起,我浪费了你的时间写了那个精彩的答案(我可以说,因为这是我最初的意思)。:-)我希望我能检查这两个答案,因为它们似乎都是处理这个问题的一种方式。我希望其他有更多专业知识的人能提出他们的意见。我想动作合成的优势在于,我可以继续提供一些标准的数据位,很多控制器都需要访问这些数据位。使用过滤器(我以前没有见过)的优点是,它都是在幕后进行的,您可以明确地处理任何事情。