【发布时间】:2012-06-05 22:18:45
【问题描述】:
被我创建的 DAO 层卡住了;在单一情况下工作得很好,但是当需要在事务块中保留几个 bean 实例时,我发现我已经把自己编码到了一个角落。为什么?查看下面的 DAO 创建方法:
def create(e: Entity): Option[Int] =
db.handle withSession { implicit ss: Session=>
catching( mapper.insert(e) ) option match {
case Some(success) => Some(Query(sequenceID))
case None => None
}
}
在会话块中发生的查询设置为自动提交,因此我无法将多个持久性操作包装在事务块中。例如,这是一个处理新成员订阅的简化理解
val result = for{
u <- user.dao.create(ubean)
m <- member.dao.create(mbean)
o <- order.dao.create(obean)
} yield (u,m,o)
result match {
case Some((a,b,c)) => // all good
case _ => // failed, need to rollback here
}
我可以手动执行查询,但速度很快就很难看
db.handle withSession { implicit ss: Session=>
ss.withTransaction {
val result = for{
u <- safe( UserMapper.insert(ubean) )
...
}
def safe(q: Query[_]) =
catching( q ) option match {
case Some(success) => Some(Query(sequenceID))
case None => None
}
}
}
因为我最终会重复错误处理,因此必须在整个应用程序中提供数据库、会话等,而不是封装在 DAO 层中
这里有人对如何解决这个问题有一些明智的建议吗?我真的很喜欢 for comprehension 的简洁性,Scala 摇滚 ;-),想法赞赏!
【问题讨论】:
标签: scala transactions persistence dao