如何更新外国实体?

Posted

技术标签:

【中文标题】如何更新外国实体?【英文标题】:How do i update a foreign entity? 【发布时间】:2014-02-02 22:33:52 【问题描述】:

我似乎无法使用.copy(..)Db.save 更新外部实体中的字段。根本不会抛出任何异常,并且从该方法返回的 T with Persisted 准确地反映了我试图更新的内容。但是,当我尝试使用Db.queryDb.fetchById 检索值时,只会更新非外部字段。例如:

case class Foo (a: String)
case class Bar (b: String, barfoo: Foo)
....
....
val foo1 = Db.save(Foo("Hello"))

val bar1 = Db.save(Bar("World", foo1))

val result = Db.save(bar1.copy(b="Beatiful World", 
        barfoo = bar1.barfoo.copy(a = "Hello My")))

println(result) // Prints: Bar(1,Beatiful World,Foo(1,Hello My))

println(Db.fetchById[Bar](result.id)) // Prints: Bar(1,Beatiful World,Foo(1,Hello))

所以,如您所见,barfoo 字段未更新。

这是更新外国实体的错误方法吗?或者这可能是一个错误?

我正在使用 SORM v0.3.12 顺便说一句。

【问题讨论】:

【参考方案1】:

此行为是设计使然。您需要显式更新内部实体。即:

Db.save(bar1.barfoo.copy(a = "Hello My"))
Db.save(bar1.copy(b="Beatiful World"))

实际上,在 SORM 开发的一个阶段,内部记录的更新是自动的(这意味着您的示例会按照您的预期工作),但它需要一个专用的 UPDATE 语句,如果内部实体没有,则该语句是多余的t 改变。所以决定把它说清楚。

这仍然是一个有争议的话题,未来的版本有可能会选择不同的方法。

【讨论】:

以上是关于如何更新外国实体?的主要内容,如果未能解决你的问题,请参考以下文章

Sonata Admin Bundle 一对多关系不保存外国 ID

我们和外国人的差距到底在哪

成外国庆集训小记(更新到9.30)

如何与陌生外国人打招呼,如果不确定对方是否欧美国家的人该怎么开口问...别用where are

Solana - 如何获得外国账户的代币余额?

求可以进外国网页的软件或者方法