Dies ist aus Abschnitt 10.7. Automatische Statuserkennung der Referenzdokumentation für den Ruhezustand:
saveOrUpdate () führt Folgendes aus:
- Wenn das Objekt in dieser Sitzung bereits persistent ist, führen Sie nichts aus
- Wenn ein anderes der Sitzung zugeordnetes Objekt dieselbe Kennung hat, wird eine Ausnahme ausgelöst
- Wenn das Objekt keine Bezeichner-Eigenschaft hat, speichern Sie es ()
- Wenn der Bezeichner des Objekts den Wert hat, der einem neu instanziierten Objekt zugewiesen wurde, speichern Sie ihn ()
- Wenn das Objekt versioniert ist (durch eine <Version> oder einen <Zeitstempel>) und der Versionseigenschaftswert der gleiche Wert ist, der einem neu instanziierten Objekt zugewiesen wurde, speichern Sie ihn ()
- Andernfalls aktualisieren () Sie das Objekt
und merge () ist sehr unterschiedlich:
- Wenn der Sitzung eine persistente Instanz mit demselben Bezeichner zugeordnet ist, kopieren Sie den Status des angegebenen Objekts auf die persistente Instanz
- Wenn der Sitzung derzeit keine persistente Instanz zugeordnet ist, versuchen Sie, sie aus der Datenbank zu laden, oder erstellen Sie eine neue persistente Instanz
- Die persistente Instanz wird zurückgegeben
- Die angegebene Instanz wird nicht mit der Sitzung verknüpft, sondern bleibt getrennt
Sie sollten Merge () verwenden, wenn Sie versuchen, Objekte zu aktualisieren, die zu einem bestimmten Zeitpunkt von der Sitzung getrennt waren, insbesondere wenn möglicherweise dauerhafte Instanzen dieser Objekte vorhanden sind, die derzeit der Sitzung zugeordnet sind. Andernfalls würde die Verwendung von SaveOrUpdate () in diesem Fall zu einer Ausnahme führen.
SaveOrUpdateCopy
ist nicht dasselbe wieSaveOrUpdate
. Ich bin mir nicht sicher, ob der FragestellerMerge
das erstere oder das letztere vergleichen wollte .SaveOrUpdateCopy
ist eine veraltete Methode, die vorMerge
dem Import in NHibernate zusammengeführt wurde .Wie ich es verstehe,
merge()
wird ein Objekt nehmen, die ein Objekt kann nicht mit der aktuellen Sitzung in Verbindung gebracht werden, und kopieren Sie die Zustand (Eigenschaftswert, etc.) , die sich mit der aktuellen Sitzung zugeordnet ist (mit der gleichen PK Wert / Kennung, von Kurs).saveOrUpdate()
werde anrufen in Ihrer Sitzung Speichern oder Aktualisieren auf, basierend auf dem Identitätswert eines bestimmten Objekts.quelle
SaveOrUpdateCopy()
ist ab NHibernate 3.1 veraltet.Merge()
sollte stattdessen verwendet werden.quelle
SaveOrUpdateCopy
was markiert istObsolete
, nichtSaveOrUpdate
. Es scheint viel Verwirrung zwischen diesen beiden unterschiedlichen Methoden in dieser Frage und den nachfolgenden Antworten zu geben.: - Wenn Sie sicher sind, dass die Sitzung keine bereits persistente Instanz mit derselben Kennung enthält, verwenden Sie update, um die Daten im Ruhezustand zu speichern
: -wenn Sie Ihre Änderungen jederzeit speichern möchten, ohne den Status einer Sitzung zu kennen, verwenden Sie merge () im Ruhezustand.
quelle
Ich habe diesen Link gefunden , der diese Art von Ausnahme ziemlich gut erklärt hat:
Was für mich funktioniert hat, ist Folgendes:
cascade="merge"
SaveOrUpdate
Das untergeordnete / abhängige Objekt zuerst, bevor es dem übergeordneten Objekt zugewiesen wird.SaveOrUpdate
das übergeordnete Objekt.Diese Lösung weist jedoch Einschränkungen auf. Das heißt, Sie müssen darauf achten, Ihr Kind / abhängiges Objekt zu retten, anstatt den Ruhezustand dies für Sie tun zu lassen.
Wenn jemand eine bessere Lösung hat, würde ich gerne sehen.
quelle
quelle