gpt4 book ai didi

scala - 如何使用事务构建数据库访问层

转载 作者:行者123 更新时间:2023-12-04 15:56:20 24 4
gpt4 key购买 nike

我尝试将应用程序迁移到 Slick 3.0。我想为 Slick 3.0 进行交易。我知道怎么做,但我想问一下类结构。
请查看示例存储库:

Slick 2.1 的一些存储库(或 DAO):

class UserRepository {
def all()(implicit: Session): Seq[User] = users.run
def insert(user: User)(implicit: Session): Int = users.insert(user)
...
}

class CarRepository {
def all()(implicit: Session): Seq[Car] = cars.run
def insert(car: Car)(implicit: Session): Int = cars.insert(car)
...
}

为了在 Slick 2.1 中进行交易,我可以创建一个可以进行交易的服务:
db.withTransaction{ implicit session =>
userRepository.insert(user)
carRepository.insert(car)
}

所以目前我有用于数据库访问和服务的存储库(或 DAO),用于更通用的逻辑。

Slick 3.0 的一些存储库(或 DAO):
class UserRepository {
def all(): Future[Seq[User]] = db.run(Users.result)
def insert(user: User): Future[Int] = db.run(Users += user)

...
}

class CarRepository {
def all(): Future[Seq[Car]] = db.run(Cars.result)
def insert(car: Car): Future[Int] = db.run(Cars += car)
...
}

在 Slick 3.0 中,我们可以在 DBIOActions 上进行事务,但是当我们具有如上所示的结构时,这是不可能的
因为 future 。我可以创建一些 UserCarRepository 类来进行交易,但我认为它不是最好的。
为了克服这种情况,我在存储库(或 DAO)中公开 DBIOActions,然后在其他层混合 DBIOActions
从一个事务中的 User 和 Car 存储库到最后返回 Future(下一层可以是对 future 进行操作的服务)。
当我们有更多的交易存储库时,它可能会有点困惑。

如何为 Slick 3.0 构建它?如何为不同存储库上的事务获得更多松散耦合?

读:
https://github.com/playframework/play-slick/tree/master/samples
https://github.com/slick/slick/issues/1084
https://groups.google.com/forum/#!topic/scalaquery/32cO7lHbxOs

最佳答案

尽可能长时间地将插入保持为 DBIOActions,根据需要组合它们,然后进行实际的 DB 查询。草图:

class UserRepository {
def all() = Users.result
def insert(user: User) = Users += user

...
}

class CarRepository {
def all() = Cars.result
def insert(car: Car) = Cars += car
...
}

val composedInserts = (for {
_ <- new UserRepository().insert(user)
_ <- new CarRepository().insert(car)
} yield ()).result

db.run(composedInserts.transactionally)

编辑:澄清消息

关于scala - 如何使用事务构建数据库访问层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31323345/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com