2012-01-01 15 views
8

Grails, etki alanı nesnelerine çağrılabilen bir isDirty method sağlar. Herhangi bir etki alanı nesnesinin kirli olup olmadığını öğrenmek için, bir yöntem basitçe çağrılabilir, böylece Grails etki alanı modeli sistemi nasıl değiştirilir.grails - bir şey kirli olup olmadığını söyle?

Çivilemediğim bazı "kaydedilmemiş geçici örnek" hatalarıyla uğraşıyorum ve neyin kirli olduğunu bilmek harika olurdu. Bunu groovy ile yapmak için şık bir yolu var mı? koleksiyonlarında en üst düzey örneklerini veya örnekleri kirli olduğunu kontrol ettiğini

import org.hibernate.Session 

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

Bu oturumları Hazırda bir isDirty() yöntemi ekler ve örneğin withSession ile kullanabilirsiniz:

cevap

11

BootStrap.groovy Bu ekle

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

veya (a def sessionFactory bağımlılık enjeksiyon örneğin) sessionFactory fasulye erişiminiz varsa Burt'un cevap dayanarak

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

Teşekkür Kod Burt ve genel olarak Grails topluluğunu desteklemek için tek yapmanız gereken. Umarım güzel bir yıl geçirmişsindir. Lütfen kodunuza küçük bir değişken eklediğimi unutmayın (lütfen içinde bir hata varsa değiştirin). Maalesef hala hatamı çivilemiyorum. B adlı B'ye sahip bir etki alanı sınıfı var. B'yi kaydetmeye çalıştığımda, kaydedilmemiş bir geçici örneğe başvurduğunu söylüyor: A, şu anda uğraştığım yalnızca A örneğini kaydetmiş olmama rağmen. . B'ye ait bir A'ya sahip olmak için değiştim, belki de B'yi şimdi yalnız bırakmalıyım? B'yi doğrudan kurtarmaya çalışmamalı mıyım? – Ray

3

, bir de yapabilir: Bunun

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

Test edilmedi, ancak bu daha kompakt: 'Session.metaClass.whatsDirty = {-> delegate.persistenceContext.entitiesByKey.values ​​() toplayın {it.isDirty()} }' –

+1

Gelecek gezginler için burada düşünüyorum olmalıdır: 'Session.metaClass.whatsDirty = {-> delegate.persistenceContext.entitiesByKey.values ​​() .Alanı {it.isDirty()}}' (yani 'topla 'yerine findAll'). Yine de yararlı bir kod. – David

İlgili konular