Смущает здесь о объектах домена в промежуточных состояниях.Почему не разблокированные объекты домена возвращаются в их «сохраненное» состояние после сброса? Могу ли я получить «чистую» версию?
Так вот класс:
class Foo {
Double price
String name
Date creationDate = new Date()
static constraints = {
price min: 50D
creationDate nullable: false
}
}
И этот тест:
@TestFor(Foo)
class FooSpec extends Specification {
void "test creation and constraints"() {
when: "I create a Foo within constraints"
Foo f= new Foo(price: 60D, name: "FooBar")
then: "It validates and saves"
f.validate()
f.save()
when: "I make that foo invalid"
f.price=49D
then: "It no longer validates"
!f.validate()
when: "I discard the changes since the last save"
f.discard()
then: "it validates again"
f.validate() //TEST FAILS HERE
}
}
Так что этот тест не на последнем Validate, потому что f.discard(), кажется, не возвращаются п к его «сохраненному» состоянию. Заметки о документах grails, как представляется, указывают на то, что это предназначено (хотя и очень запутывающее для меня хотя бы) поведение. То, что все «отбрасывает» делает, указывает на то, что это не должно быть сохранено (что бы это никоим образом не было, если он не сработал с ограничениями, поэтому в таком случае, я думаю, он ничего не делает правильно?) Я думал, что обновление может получить меня сохраненное состояние или даже Foo.get ([id]), но ничего из этого не работает. Foo.get получает поврежденную версию, а f.refresh выбрасывает nullPointer, очевидно, потому что creationDate имеет значение null, и этого не должно быть.
Так что все это путает, и кажется, что нет способа вернуться к сохраненному состоянию объекта, если он не был покраснел. Это действительно так? Какой вид поднимает вопрос «В каком отношении сохраняется объект?»
Это, похоже, означает, что я хочу убедиться, что я определенно читаю из db не кеш, если я хочу быть конечно, я получаю действительное постоянное состояние объекта, \ не какое-то поврежденное промежуточное состояние.
Связанный вопрос: не уверен, что область локального кеша - это ограничение для сеанса? Я начинаю другой сеанс и извлекаю этот идентификатор, я получу нуль, потому что он никогда не был сохранен, а не коррумпированная версия с недопустимой ценой?
Понравился кто-то, объяснив основной проект здесь.
Спасибо.
Спасибо. Ограничен ли объем грязного объекта сеансом? В приведенном выше случае, когда объект сохраняется, но не сбрасывается, будет ли отдельный запрос на том же сервере, который вызывает Foo.get (f.id), получить нулевой или грязный объект? – user1023110
На самом деле, Берт, похоже, не отбрасывает(), и get (f.id) вернет его в сохраненное состояние в примере выше. Если я вызываю f.save (flush: true), тогда это будет работать, но похоже, что get (f.id) возвращает null после сброса, если элемент не был сброшен. Итак, это возвращает меня к моему первоначальному вопросу, который заключается в том, что кажется, что вы не можете вернуть незакрепленный объект в его сохраненное состояние, если вы вносите изменения после сохранения. Это верно? – user1023110
get() никогда не должен возвращать значение null, если для этого идентификатора нет строки. Вы увидите, что если была проблема проверки с вызовом save() ранее в сеансе, но вы должны проверить hasErrors(), чтобы убедиться, что она была успешной. –