1
陷入我創建的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層
任何人都有一些賢者的建議在這裏如何解決這個問題?我真的很喜歡理解的簡潔,斯卡拉岩石;-),理念表示讚賞!