почему доступ только для чтения - запись в мою базу данных в GORM? - PullRequest
0 голосов
/ 01 октября 2011

В моем приложении у меня есть такой код:

// 1
Foo.get(123).example = "my example" // as expected, don't change value in db

// 2
Foo.get(123).bars.each { bar ->
    bar.value *= -1 // it's changing "value" field in database!! WHY?
}
  • примечание: Foo и Bar - это таблицы в моей БД

Почему сохранение gorm в базе данных является вторым случаем? У меня нет метода save () в коде.

Tks


РЕШИТЬ: Мне нужно использовать read(), чтобы получить сеанс только для чтения. (Foo.discard () также работает)

Документ: http://grails.org/doc/latest/guide/5.%20Object%20Relational%20Mapping%20%28GORM%29.html#5.1.1%20Basic%20CRUD

(в первом случае, я думаю, я ошибся)

1 Ответ

2 голосов
/ 01 октября 2011

Оба должны сохранить, поэтому первый пример выглядит как ошибка.Запросы Grails выполняются в контексте перехватчика OpenSessionInView.Это открывает сеанс Hibernate в начале каждого запроса и привязывает его к потоку, а также сбрасывает и закрывает его в конце запроса.Это очень помогает при отложенной загрузке, но может иметь неожиданные последствия, как вы видите.

Хотя вы не сохраняете явным образом, логика сброса Hibernate включает в себя поиск всех прикрепленных экземпляров, которые были изменены, и отправкуобновления базы данных.Это оптимизация производительности, поскольку, если бы каждое изменение было перенесено, это замедляло бы работу.Так что все, что может подождать, пока очистка не будет поставлена ​​в очередь.

Таким образом, единственное время, которое вам нужно явно сохранить, - это для новых экземпляров и когда вы хотите проверить ошибки проверки.

...