4

我有带有 byId 的模型存储库类并保存方法

def byID(id:Long) = db.run{ query.filter(_.id === id).result }.map(_.headOption)
def save(model:User) = db.run{ query.filter(_.id===model.id).update(model) }

现在我想同时使用这两种方法,首先加载用户,然后更改某些内容,然后保存用户,就像这样

userRepository.byID(5L).map{_.map{user =>
  val newuser = user.copy(name = "John")
  userRepository.save(newuser)            
}}

我怎样才能在一笔交易中做到这一点?

4

1 回答 1

1

我认为 slick 3 不支持跨越不同期货的交易,当你打电话时,db.run你是传入DBIO[SomeType]Future传出。好消息是,您可以改用 DBIO 以稍微不同的方式构建 API:

def byID(id:Long) = query.filter(_.id === id).result }.map(_.headOption)
def save(model:User) = query.filter(_.id===model.id).update(model)

接着:

db.run(userRepository.byID(5L).flatMap { users => 
  DBIO.sequence(users.map { user =>
    userRepository.save(user.copy(name = "John"))            
  })
}.transactionally)
于 2015-07-16T09:27:54.787 回答