2012-05-31 3 views
1

내가 만든 DAO 레이어로 고생하고있다. 단일 케이스에서 잘 작동하지만 트랜잭션 블록에 여러 개의 빈 인스턴스를 유지해야하는 경우 필자는 자신을 구석에 코딩 한 것을 발견했다. 왜? 아래 만든 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 레이어에 캡슐화하는 대신 응용 프로그램 전체에 데이터베이스, 세션 등을 제공하십시오.

누구나이 문제를 해결하는 방법에 대한 몇 가지 현명한 조언이 있습니다. 나는 이해를위한 Concare, Scala rocks ;-), idea appreciations를 정말 좋아합니다!

이 엔티티에 DAO 때문에 1 대 1의 관계, 그리고 ScalaQuery의 자동 수행, 세션 블록에서 실행되는 쿼리를 저지른 : 사람이 더 나은 아이디어를 가지고 있지 않는

는 여기에 내가 함께 압연하고있는 무슨

답변

0

OK입니다 DAO 구현을 통해 별도의 엔티티에 여러 삽입을 수행 할 수 없습니다.

해결이 GenericDAO을 생성하는, 하나는 오류 트랜잭션 조회 기능을 제공하는 특정 엔티티에 구속되지는 구현이다 dao.createMember(...)된다 컨트롤러 계층에서 상위 특성

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

로 추출 핸들링 꽤 좋은, imo, 트랜잭션 삽입물은 이해하기 쉽고, 멋진 것들을 사용합니다.