내가 만든 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의 자동 수행, 세션 블록에서 실행되는 쿼리를 저지른 : 사람이 더 나은 아이디어를 가지고 있지 않는
는 여기에 내가 함께 압연하고있는 무슨