2012-01-01 18 views
8

Grails cung cấp isDirty method có thể được gọi trên các đối tượng miền. Làm thế nào một trong những sửa đổi hệ thống mô hình miền Grails, như vậy mà có thể chỉ đơn giản là gọi một phương pháp, để tìm hiểu xem có bất kỳ đối tượng tên miền là bẩn.grails - cho tôi biết nếu có gì bẩn?

Tôi đang gặp khó khăn với một số lỗi "tạm thời chưa được lưu" của trường hợp mà tôi chưa thể thực hiện được, và thật tuyệt vời khi biết những gì bị bẩn. Có một cách thanh lịch để làm điều này với groovy?

Trả lời

11

Thêm phần này vào BootStrap.groovy:

import org.hibernate.Session 

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

này sẽ thêm một phương pháp isDirty() để Hibernate phiên để kiểm tra rằng các trường hợp cấp cao nhất hoặc trường hợp trong bộ sưu tập là bẩn và bạn có thể sử dụng nó với withSession, ví dụ

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

hoặc nếu bạn có quyền truy cập vào các đậu sessionFactory (ví dụ như từ một mũi tiêm def sessionFactory phụ thuộc)

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

Cám ơn này mã Burt và tất cả những gì bạn làm để hỗ trợ cộng đồng Grails nói chung. Hy vọng bạn đã có một năm mới tốt đẹp. Xin lưu ý tôi đã thêm một biến thể nhỏ vào mã của bạn (vui lòng thay đổi nếu tôi có lỗi trong đó). Rất tiếc, tôi vẫn không thể giải quyết được lỗi của mình. Tôi đã có một tên miền A, mà hasMany B. Khi tôi cố gắng để lưu B, nó nói với tôi nó tham chiếu một ví dụ thoáng qua chưa lưu: A, mặc dù tôi vừa lưu bản sao duy nhất của A Tôi đang xử lý tại thời điểm này . Tôi đã thay đổi B để có một người thuộc về A, vì vậy có lẽ tôi nên hoàn toàn bỏ B một mình bây giờ? Tôi không bao giờ nên cố gắng cứu B trực tiếp? – Ray

3

Dựa trên câu trả lời Burt, người ta cũng có thể làm:

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

Không được thử nghiệm, nhưng điều này nhỏ gọn hơn: 'Session.metaClass.whatsDirty = {-> delegate.persistenceContext.entitiesByKey.values ​​(). Thu thập {it.isDirty()} }' –

+1

Đối với khách du lịch trong tương lai ở đây tôi nghĩ rằng nên là: 'Session.metaClass.whatsDirty = {-> delegate.persistenceContext.entitiesByKey.values ​​(). findAll {it.isDirty()}}' (ví dụ 'findAll' thay vì' collect'). Tuy nhiên, một chút mã hữu ích. – David

Các vấn đề liên quan