2012-01-01 57 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

相關問題