2012-01-01 19 views
8

Grails proporciona un isDirty method que se puede invocar en objetos de dominio. ¿Cómo se podría modificar el sistema de modelo de dominio de Grails, de forma que se pueda simplemente llamar a un método, para averiguar si algún objeto de dominio está sucio?grails - dime si algo está sucio?

Estoy luchando con algunos errores de "instancia transitoria no guardada" que no he podido identificar, y sería genial saber qué es lo que está sucio. ¿Hay una forma elegante de hacer esto con Groovy?

Respuesta

11

Añadir esto a BootStrap.groovy:

import org.hibernate.Session 

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

Esto añade un método isDirty() a Hibernate sesiones que comprueba que las instancias de nivel superior o instancias en las colecciones están sucios y se puede usar con withSession, por ejemplo,

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

o si tiene acceso al bean sessionFactory (por ejemplo, de una inyección def sessionFactory dependencia)

boolean dirty = sessionFactory.currentSession.isDirty() 
+1

Gracias a este código Burt y todo lo que haces para apoyar a la comunidad de Grails en general. Espero que tengas un buen año nuevo. Tenga en cuenta que agregué una pequeña variante a su código (cambie si hay un error en él). Lamentablemente, todavía no puedo identificar mi error. Tengo una clase de dominio A, que tiene Many B. Cuando intento guardar B, me dice que hace referencia a una instancia transitoria no guardada: A, aunque acabo de guardar la única instancia de A con la que estoy tratando en este momento. . Cambié B para tener un pertenece a A, así que quizás debería dejar completamente solo a B ahora? Nunca debería tratar de guardar B directamente? – Ray

3

Sobre la base de la respuesta de Burt, también se podría hacer:

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

No probado, pero esto es más compacto: 'Session.metaClass.whatsDirty = {-> delegate.persistenceContext.entitiesByKey.values ​​(). Collect {it.isDirty()} }' –

+1

Para futuros viajeros aquí, creo que debería ser: 'Session.metaClass.whatsDirty = {-> delegate.persistenceContext.entitiesByKey.values ​​(). findAll {it.isDirty()}}' (es decir, 'findAll' en lugar de' collect'). Un poco útil de código, sin embargo. – David

Cuestiones relacionadas