2009-11-09 5 views
12

Ho un test di integrazione nella mia applicazione Grails che non riesce quando si tenta di salvare un soggetto di tipo MemberHibernate/GORM: collezione non è stato elaborato dal flush()

invitingMember.save(flush: true) 

Ciò solleva la seguente eccezione

org.hibernate.AssertionFailure: raccolta [com.mycompany.facet.Facet.channels] è stato non trattati da incasso() a com.mycompany.member.MemberConnectionService.addOrUpdateContact (MemberC onnectionService.groovy: 939)

precedenza nella transazione che aggiungere un oggetto a una proprietà della raccolta di invitingMember. La mia ipotesi è che l'eccezione sia lanciata nella riga sopra, perché è solo a questo punto che l'oggetto aggiunto alla raccolta è persistente.

risposta

6

Il problema sottostante è probabilmente che Hibernate non esegue la cascata del salvataggio. Quindi, quando si scarica lo Member, Hibernate nota che la raccolta è ancora sporca (il che probabilmente non è quello che si desidera). Quindi scarica la raccolta manualmente o tell Hibernate to cascade all the updates.

+1

Sono quasi sicuro che quando si utilizza GORM (l'ORM utilizzato da Grails che è stato creato "sopra a" Hibernate) i salvataggi sono in cascata per impostazione predefinita. –

1

L'unica volta che ho incontrato quell'esecuzione è quando si utilizzano gli eventi di Hibernate, ad es. beforeInsert, beforeUpdate etc - stai usando questi?

C'è un problema in JIRA relative a questo, che è stato fissato per Grails 1.2

+0

No, non sto usando nessun evento –

3

ho trovato una possibile soluzione here.

In realtà, guarda toString, equals, hashcode e assicurati di non accedere al tuo lazy accessor.

So che sto parlando di Java e qui la domanda riguarda i graal ma forse c'è lo stesso tipo di cosa per i graal.

Non esitate a modificare.

E 'stato il problema per me (in java)

1

ho avuto questo errore quando un elemento è tentato di aggiungere a una collezione dopo eliminare gli elementi della collezione. Ho risolto il problema chiamando save(flush:true) prima di aggiungere nuovi elementi alla raccolta.

  • Nel mio caso, la raccolta viene sempre restituita da un select.