Grails - скажи мне, если что-то грязное? - PullRequest
8 голосов
/ 01 января 2012

Grails предоставляет метод isDirty , который можно вызывать для объектов домена. Как изменить систему доменной модели Grails, чтобы можно было просто вызвать метод, чтобы выяснить, не являются ли какие-либо доменные объекты грязными.

Я борюсь с некоторыми "несохраненными временными" ошибками, которые мне не удалось зафиксировать, и было бы здорово узнать, что грязно. Есть ли элегантный способ сделать это с помощью Groovy?

Ответы [ 2 ]

11 голосов
/ 01 января 2012

Добавьте это к BootStrap.groovy:

import org.hibernate.Session

Session.metaClass.isDirty = { ->
   delegate.persistenceContext.entitiesByKey.values().any { it.isDirty() }
}

Это добавляет метод isDirty() к сеансам Hibernate, который проверяет, являются ли экземпляры верхнего уровня или экземпляры в коллекциях грязными, и вы можете использовать его с withSession, например,

boolean dirty = SomeDomainClass.withSession { session -> session.isDirty() }

или если у вас есть доступ к компоненту sessionFactory (например, из def sessionFactory внедрения зависимости)

boolean dirty = sessionFactory.currentSession.isDirty()
3 голосов
/ 06 января 2012

Основываясь на ответе Берта, можно также сделать:

   Session.metaClass.whatsDirty = { ->
       def everythingDirty = []
       delegate.persistenceContext.entitiesByKey.values().each { if (it.isDirty()) everythingDirty.add(it) }
       return everythingDirty
    }
...