在数据库中刷新对象之前,将返回光滑的更新操作
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在数据库中刷新对象之前,将返回光滑的更新操作相关的知识,希望对你有一定的参考价值。
我遇到的情况是,当我在更新后立即获取对象时,有时我从数据库获得的结果不包含最新的更改。
这使我认为更新线程在对象实际在DB中提交之前返回。这是预期的行为吗?
我认为更新方法只会在更改成功刷新到数据库后返回,但看起来这样做无法保证。
下面是伪代码,展示了我在说什么。
def processObject = {
for {
objectId: Option[Long] <- saveObjectInDb
_ <- {
//perform other synchronous business logic and then update created object details
dao.findById(objectId.get).map { objectOption: Option[MyObject] =>
dao.update(objectOption.get.copy(processingStep = "third-step"))
}
}
mostRecentMyObject <- dao.findById(objectId.get)
} yield mostRecentMyObject
}
下面是我的update
逻辑的样子
def update(myObject: MyObject): Future[Int] = {
db.run(table.filter(_.id === myObject.id).update(myObject))
}
答案
问题是你没有考虑Future
方法返回的内部update
。
鉴于findById
的签名:
def findById(id: Long): Future[Option[MyObject]]
片段:
dao.findById(objectId.get).map { objectOption: Option[MyObject] =>
dao.update(objectOption.get.copy(processingStep = "third-step"))
}
将给出Future[Future[Int]]
类型的对象。
你应该在flatMap
未来而不是map
而不是findById
,如下:
dao.findById(objectId.get).flatMap { objectOption: Option[MyObject] =>
dao.update(objectOption.get.copy(processingStep = "third-step"))
}
这将简化为单个未来(Future[Int]
),因此您可以确保只在插入后检索对象。
此外,您可以将其重写为:
def processObject = {
for {
objectId: Option[Long] <- saveObjectInDb
objectOption <- dao.findById(objectId.get)
_ <- dao.update(objectOption.get.copy(processingStep = "third-step"))
mostRecentMyObject <- dao.findById(objectId.get)
} yield mostRecentMyObject
}
因为,为了理解,<-
是flatMap
的语法糖
以上是关于在数据库中刷新对象之前,将返回光滑的更新操作的主要内容,如果未能解决你的问题,请参考以下文章
你可以使用 Dapper 来刷新现有的对象引用而不是总是返回新的吗?