2009-08-14 6 views
1

Grund Reihenfolge der Ausführung:NHibernate NonUniqueObjectException wenn Objekte in die Sitzung wieder anbringen (mit Lock)

  1. Eine Sammlung von PersistentObjects abgefragt wird dann von der Sitzung getrennt zwischengespeichert.
  2. Die Auflistung wird an ein Modul übergeben, das sie erneut an die Sitzung anfügen muss, um einige der Eigenschaften (unter Verwendung von session.Lock(obj, LockMode.None)) zu laden.
  3. Nachdem das Modul die Verarbeitung abgeschlossen hat, versucht ein anderes Modul, SaveOrUpdate ein UserSetting Objekt mit einigen Verwendungsstatistiken für den Benutzer zu initialisieren, der die Aktion initialisiert hat.
  4. Auf session.Flush() NHibernate wirft eine NonUniqueObjectException.

Ich habe festgestellt, dass ein Weg, um dieses Problem zu arbeiten ist mit neuen Kopien der Objekte zu erhalten:

obj = session.Get(obj.GetType(), (obj as PersistentObject).Id); 

statt mit session.Lock von reattaching. Dies ist jedoch nicht optimal, da einige der Datensätze potenziell recht groß sind. Wenn Sie jedes Objekt einzeln neu abrufen, kann dies zu einem Leistungsverlust führen.

Das Objekt, das nicht eindeutig ist, ist ein referenziertes Objekt, das nur in der Klasse PersistentObject und nicht in der Klasse UserSetting existiert. Ich kann also nicht verstehen, warum ein Flush diese Ausnahme verursachen würde.

Ich habe versucht, die zwischengespeicherten Objekte zu entfernen, nachdem das Modul mit ihnen fertig ist, aber das hilft nicht.

Kennt jemand eine bessere Möglichkeit, Objekte an die Sitzung anzuhängen, die dieses Problem vermeiden könnte?

Antwort

3

Können Sie eine neue Sitzung (oder Transaktion) für die Verarbeitung jedes Elements und für die Aktualisierung der UserSetting verwenden? Dies würde wahrscheinlich die NonUniqueException verhindern.

Cheers,

-Maarten

+0

Doh! Das ist die naheliegende Lösung und die, an die ich hätte denken sollen. Jetzt fühle ich mich dumm. ;) – Joel

Verwandte Themen