2017-10-29 18 views
1

트랜잭션에서 3 개의 테이블에 삽입하는 것이지만 첫 번째 테이블에서는 삽입을 사용합니다. 여기 Slick 3 - 다른 테이블을 기반으로 트랜잭션 방식으로 여러 테이블에 삽입

는 별개의 쿼리입니다
val personId = persons returning persons.map(_.id)) += Person(occupation) 
translatedProperty += TranslatedProperty(languageId, propertyId, propertyName) 
personProperties += PersonProperty(personId, propertyId, propertyValue) 

지금 어디 선가에서 Seq(propertyName, propertyValue)을받을 수 있도록 반복.

위와 같이 순차적으로 삽입하면 데이터베이스가 작동하지 않을 때까지 모든 것이 작동합니다. 따라서 위의 삽입을 트랜잭션 방식으로하고 싶습니다.

은 그래서 시도 : 다음 props = (properties.values.map { ... (대신 <- 내가 =를 사용)으로하지만 아무 소용이 시도

[error] found : Seq[Unit] [error] required: slick.dbio.DBIOAction[?,?,?] [error] props <- (properties.values.map

:

val dbAction = (for { 
    val personId = persons returning persons.map(_.id)) += Person(occupation) 
    props <- (properties.values.map { 
    x => 
    { 
     val name = x.key 
     val value = x.value 

     translatedProperties += TranslatedProperty(languageId, propertyId, name) 
     personProperties += PersonProperty(personId, propertyId, value) 
    } 
    }) 
} yield()).transactionally 

db.run(dbAction) 

이 나에게 컴파일 오류를 제공합니다. 그 사람은 삽입 되나 속성은 절대 사용되지 않습니다.

내가 뭘 잘못하고 있니?

props은 단지 하나가 아닌 Seq[FixedSqlAction]이 될 것이라고 생각합니까?

여기서 h2를 사용한다고 언급해야합니다.

답변

3

I assume it's because props would be a Seq[FixedSqlAction] instead of just one?

네, 바로 그 이유가 있습니다.

문제에 대한 해결책은 간단과 같이 DBIO.seqproperties.values.map... 일부를 포장하는 것

:

val dbAction = (for { 
    val personId = persons returning persons.map(_.id)) += Person(occupation) 
    props <- DBIO.seq(properties.values.map { 
    x => 
    { 
     val name = x.key 
     val value = x.value 

    val insertTranslatedProperties = translatedProperties += TranslatedProperty(languageId, propertyId, name) 
    val insertPersonProperties = personProperties += PersonProperty(personId, propertyId, value) 

    insertTranslatedProperties andThen insertPersonProperties 
    } 
    }: _*) 
} yield()).transactionally 

이 또한 하나의 DBIOAction

로 병합하는 andThen와 두 개의 내부 삽입 체인