2009-11-09 14 views
12

ich einen Integrationstest in meiner Grails-Anwendung, die fehlschlägt, wenn ich versuche, eine Einheit vom Typ MemberHibernate/GORM: Sammlung nicht bündig verarbeitet wurde()

invitingMember.save(flush: true) 

Dies wirft die folgende Ausnahme

zu speichern

org.hibernate.AssertionFailure: Sammlung [com.mycompany.facet.Facet.channels] wurde nicht von flush() verarbeitet bei com.mycompany.member.MemberConnectionService.addOrUpdateContact (MemberC onnectionService.groovy: 939)

Früher in der Transaktion füge ich ein Objekt zu einer Auflistung Eigenschaft invitingMember hinzu. Meine Vermutung ist, dass die Ausnahme auf die obige Zeile geworfen wird, da das Objekt, das der Sammlung hinzugefügt wurde, nur zu diesem Zeitpunkt beibehalten wird.

Antwort

6

Das zugrunde liegende Problem ist wahrscheinlich, dass Hibernate das Speichern nicht kaskadiert. Wenn Sie also die Member löschen, merkt Hibernate, dass die Sammlung immer noch schmutzig ist (was wahrscheinlich nicht das ist, was Sie wollen). Also entweder die Sammlung manuell leeren oder tell Hibernate to cascade all the updates.

+1

Ich bin mir ziemlich sicher, dass bei der Verwendung von GORM (das ORM von Grails verwendet wird, das "über" Hibernate "gebaut wird) speichert werden standardmäßig kaskadiert. –

1

Die einzige Zeit, die ich diese Ausnahme festgestellt habe, ist, wenn Hibernate-Ereignisse, z. beforeInsert, beforeUpdate etc - benutzen Sie diese?

Es gibt ein Problem in JIRA im Zusammenhang mit dieser, die für Grails behoben wurden 1,2

+0

Nein, ich verwende keine Ereignisse –

3

ich eine mögliche Lösung here gefunden.

Betrachten Sie ToString, equals, hashcode und stellen Sie sicher, dass Sie nicht auf Ihren faulen Accessor zugreifen.

Ich weiß, ich spreche über Java und hier ist die Frage über Grails, aber vielleicht gibt es die gleiche Sache für Grails.

Zögern Sie nicht zu bearbeiten.

Es war das Thema für mich (in Java)

1

ich diesen Fehler hatte, als ein Element zu einer Sammlung hinzuzufügen versuchte, nach Elementen aus der Sammlung löschen. Ich löste es durch Aufruf save(flush:true) bevor neue Elemente der Sammlung hinzufügen.

  • In meinem Fall wird die Sammlung immer von einer select zurückgegeben.
Verwandte Themen