2014-02-02 2 views
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 кстати.

ответ

1

Это поведение по дизайну. Вам необходимо явно обновить внутренний объект. То есть:

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

На самом деле на одной стадии развития СОРМ в обновление внутренних записей было автоматическое (это означает, что ваш пример работал бы, как вы ожидали), но требуется специальный UPDATE заявление, которое было излишним в тех случаях, когда внутренняя сущность не изменилась. Поэтому было принято решение сделать это явным.

Это все еще спорный вопрос, и есть вероятность, что в будущих версиях будет выбран другой подход.

+0

Спасибо за разъяснение. Это работает. – jsonmurphy