2012-05-31 66 views
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層

任何人都有一些賢者的建議在這裏如何解決這個問題?我真的很喜歡理解的簡潔,斯卡拉岩石;-),理念表示讚賞!

回答

0

OK,除非有人有更好的主意,這裏就是我與滾動:

由於DAO到實體是1對1的關係,並ScalaQuery汽車承諾在一個會話框執行的查詢,執行通過我的DAO實現不可能在單獨的實體上進行多次插入。

解決方法是創建一個GenericDAO,一個不依賴於一個特定的實體,其提供事務查詢功能,進行錯誤處理萃取到父性狀

def createMember(...): Boolean = { 
     db.handle withSession { implicit ss: Session=> 
     ss.withTransaction { 
      val result = for{ 
      u <- safeInsert(UserMapper.insert(ubean))(ss) 
      ... 
      } 
      ... 

在控制器層的實現變得dao.createMember(...)這是相當不錯,imo,事務插入使用安全理解,很酷的東西。