Den Unterschied zwischen Persist() und Merge() in JPA und Hibernate verstehen
In JPA und Hibernate sind persist() und merge ()-Methoden spielen eine entscheidende Rolle bei der Verwaltung von Entitäten und der Handhabung der Datenpersistenz. Sie weisen jedoch deutliche Unterschiede in ihrem Verhalten auf.
Persist()
Die Methode persist(), wie in der JPA-Spezifikation definiert, funktioniert wie folgt:
- Wenn die Entität neu und nicht verwaltet ist, wird sie verwaltet und in der Datenbank gespeichert, wenn die Transaktion festgeschrieben oder geleert wird.
- Wenn die Entität ist bereits verwaltet oder entfernt, der Vorgang wird ignoriert.
- Wenn die Entität getrennt wird, kann eine Ausnahme ausgelöst werden oder der Persistenzvorgang kann während der Flush- oder Commit-Zeit fehlschlagen.
- Die Kaskade Operationen werden auf alle referenzierten Entitäten mit cascade=PERSIST oder cascade=ALL angewendet Anmerkungen.
Merge()
Andererseits hat die Methode merge() eine andere Semantik:
- Wenn die Entität getrennt wird, wird ihr Status auf eine bereits vorhandene verwaltete Entität mit derselben Identität kopiert, oder es wird eine neue verwaltete Kopie erstellt erstellt.
- Wenn die Entität neu ist, wird eine neue verwaltete Entität erstellt und ihr Status wird von der eingehenden Entität kopiert.
- Wenn die Entität entfernt wird, wird eine Ausnahme ausgelöst.
- Wenn die Entität verwaltet wird, wird die Operation ignoriert, Kaskadenoperationen werden jedoch weiterhin auf referenzierte Entitäten angewendet, wenn sie mit cascade=MERGE oder annotiert sind cascade=ALL.
- Die zusammengeführte Entität verweist auf die verwalteten Entitäten für alle Beziehungen, die mit cascade=MERGE oder cascade=ALL annotiert sind.
- Wenn eine Entität mit einem Verweis auf eine nicht kaskadierte Beziehung zusammengeführt wird , gibt die Zuordnung der zusammengeführten Entität einen Verweis auf ein verwaltetes Objekt mit derselben Identität zurück.
Wann zu verwenden Persist() oder Merge()
Basierend auf diesen Unterschieden können Ihnen die folgenden Richtlinien bei der Auswahl der geeigneten Methode helfen:
- Verwenden Sie persist(), wenn Sie erstellen möchten eine neue Entität oder aktualisieren Sie eine vorhandene Entität, die noch nicht vom Persistenzkontext verwaltet wird.
- Verwenden Sie merge(), wenn Sie eine vorhandene Entität aktualisieren möchten, die bereits verwaltet wird, aber außerhalb der Persistenz geändert wurde Kontext.