2012-01-01 55 views
8

Grails提供了一个可以在域对象上调用的isDirty method。如何修改Grails域模型系统,以便可以简单地调用一个方法来查找是否有任何域对象是脏的。grails - 告诉我是否有脏东西?

我正在努力解决一些“未保存的瞬时实例”错误,我一直无法确定,并且很高兴知道什么是脏的。有没有一种优雅的方式与groovy做到这一点?

回答

11

一下添加到BootStrap.groovy中:

import org.hibernate.Session 

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

这增加了一个isDirty()方法的Hibernate Session来检查,在集合顶级实例或实例是脏的,你可以用withSession,例如使用

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

,或者如果你有(从def sessionFactory依赖注入EG)访问sessionFactory

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

感谢这个代码Burt以及您为支持Grails社区所做的一切。希望你有一个美好的新年。请注意,我在代码中添加了一个轻微的变体(如果我有错误,请更改)。不幸的是,我仍然无法确定我的错误。我有一个域类A,它有很多B.当我试图保存B时,它告诉我它引用了一个未保存的瞬态实例:A,即使我现在只保存了A的唯一实例。我改变了B有一个属于A,所以也许我现在应该完全离开B?我不应该试图直接保存B? – Ray 2012-01-03 18:14:34

3

基于伯特的答案,我们也可以这样做:

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

未经测试,但这是更紧凑:'Session.metaClass.whatsDirty = { - > delegate.persistenceContext.entitiesByKey.values()。collect {it.isDirty()} }' – 2012-01-07 05:04:45

+1

对于未来的旅行者,我认为应该是:'Session.metaClass.whatsDirty = { - > delegate.persistenceContext.entitiesByKey.values()。findAll {it.isDirty()}}'(即'findAll'而不是'collect')。尽管如此,这是一段有用的代码。 – David 2013-05-27 09:42:18

相关问题