1

.copy(..)と を使用し て外部エンティティ内のフィールドを更新できないようですDb.save。例外はまったくスローされずT with Persisted、メソッドから返されたものは、更新しようとしたものを正確に反映しています。Db.queryただし、またはを使用して値を取得しようとすると、Db.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 btwを使用しています。

4

1 に答える 1

1

この動作は仕様です。内部エンティティを明示的に更新する必要があります。すなわち:

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

実際、SORM の開発の 1 つの段階では、内部レコードの更新は自動でした (つまり、例が期待どおりに機能したことを意味します) がUPDATE、内部エンティティが変更されない場合に冗長な専用のステートメントが必要でした。そのため、それを明確にする決定が下されました。

これはまだ議論の余地があるテーマであり、将来のバージョンでは別のアプローチが選択される可能性があります。

于 2014-02-03T07:09:34.770 に答える