我在Play 2.1 Scala项目中使用JDO进行数据存储。理想情况下,我希望每个请求都有自己的事务,在完成时提交,如果出现问题则回滚。
我可以想出这样做的最好方法是使用Action Composition,我在其中创建自己的Action
- 类似对象来启动事务,将代码块包装在Action
中,进行评估它并保存结果,提交或回滚事务,然后返回结果。
我唯一担心的是,我的整个项目现在由DbAction
而不是常规Action
组成。我不确定为什么这会让我感到担心,除了我认为必须有一个更好的地方来做这件事。但是,当我检查GlobalSettings
中可用的钩子时,看起来没有任何效果。
我应该选择DbAction
并停止自我猜测,还是有一个地方可以将这种行为挂钩,以便我可以使用Action
?
托德
答案 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)