2014-12-02 2 views
3

Смущает здесь о объектах домена в промежуточных состояниях.Почему не разблокированные объекты домена возвращаются в их «сохраненное» состояние после сброса? Могу ли я получить «чистую» версию?

Так вот класс:

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 не кеш, если я хочу быть конечно, я получаю действительное постоянное состояние объекта, \ не какое-то поврежденное промежуточное состояние.

Связанный вопрос: не уверен, что область локального кеша - это ограничение для сеанса? Я начинаю другой сеанс и извлекаю этот идентификатор, я получу нуль, потому что он никогда не был сохранен, а не коррумпированная версия с недопустимой ценой?

Понравился кто-то, объяснив основной проект здесь.
Спасибо.

ответ

2

Hibernate не имеет процесса возврата состояния, хотя кажется, что он может, так как он хранит чистую копию данных для грязной проверки. Вызов метода GORM discard() вызывает несколько методов слоя на этом пути, но реальная работа выполняется в методе SessionImpl.evict(Object) Hibernate, который просто удаляет состояние из кэшей сеанса и отключает экземпляр сеанса, но он ничего не делает для постоянных свойств в экземпляр. Если вы хотите отменить изменения, вы должны вывести экземпляр с помощью discard() и перезагрузить его, например. f = Foo.get(f.id)

+0

Спасибо. Ограничен ли объем грязного объекта сеансом? В приведенном выше случае, когда объект сохраняется, но не сбрасывается, будет ли отдельный запрос на том же сервере, который вызывает Foo.get (f.id), получить нулевой или грязный объект? – user1023110

+0

На самом деле, Берт, похоже, не отбрасывает(), и get (f.id) вернет его в сохраненное состояние в примере выше. Если я вызываю f.save (flush: true), тогда это будет работать, но похоже, что get (f.id) возвращает null после сброса, если элемент не был сброшен. Итак, это возвращает меня к моему первоначальному вопросу, который заключается в том, что кажется, что вы не можете вернуть незакрепленный объект в его сохраненное состояние, если вы вносите изменения после сохранения. Это верно? – user1023110

+0

get() никогда не должен возвращать значение null, если для этого идентификатора нет строки. Вы увидите, что если была проблема проверки с вызовом save() ранее в сеансе, но вы должны проверить hasErrors(), чтобы убедиться, что она была успешной. –