2009-11-09 7 views
12

mam test integracji w mojej aplikacji Grails, że zawodzi, gdy próbuję zapisać podmiot typu MemberHibernate/GORM: zbiór nie został przetworzony przez flush()

invitingMember.save(flush: true) 

Nasuwa się następujący wyjątek

org.hibernate.AssertionFailure: zbiór [com.mycompany.facet.Facet.channels] został przetworzone przez spłuczki() przy com.mycompany.member.MemberConnectionService.addOrUpdateContact (MemberC onnectionService.groovy: 939)

Wcześniej w transakcji dodałem obiekt do właściwości kolekcji invitingMember. Domyślam się, że wyjątek jest wyrzucany w linii powyżej, ponieważ tylko w tym momencie obiekt dodany do kolekcji jest utrzymywany.

Odpowiedz

6

Podstawowym problemem jest prawdopodobnie to, że Hibernate nie kaskaduje zapisu. Tak więc po przepłukaniu Member, Hibernate zauważa, że ​​kolekcja jest nadal brudna (co prawdopodobnie nie jest tym, czego potrzebujesz). Więc przepłucz kolekcję ręcznie lub tell Hibernate to cascade all the updates.

+1

Jestem całkiem pewny, że podczas korzystania z GORM (ORM używany przez Grails, który jest zbudowany "na wierzchu" Hibernuj), zapisy są domyślnie kaskadowane. –

1

Jedyny przypadek, w którym spotkałem się z tą operacją, występuje podczas używania zdarzeń hibernacji, np. beforeInsert, beforeUpdate etc - używasz ich?

Jest to problem w JIRA podobne do tego, które zostało ustalone dla Grails 1.2

+0

Nie, nie używam żadnych zdarzeń –

3

Znalazłem możliwe rozwiązanie here.

Właściwie spójrz na toString, równe, hashcode i upewnij się, że nie uzyskujesz dostępu do swojego leniwego akcesora.

Wiem, że mówię o java i tutaj pytanie dotyczy grails, ale być może jest taki sam rodzaj dla grails.

Nie wahaj się edytować.

To był problem dla mnie (w Javie)

1

miałem ten błąd, gdy starał się dodać elementu do zbioru po usuwać elementy z kolekcji. Rozwiązałem go, dzwoniąc pod numer save(flush:true), zanim dodaję nowe elementy do kolekcji.

  • W moim przypadku kolekcja jest zawsze zwracana z select.
Powiązane problemy