Was ist die beste Praxis für die bulk-delete in jpa
Ich versuche, bulk-delete in meine Personen, ich dachte, die beste Lösung zu sein um zu gehen mit CriteriaDelete
. Aber CriteriaDelete
nicht-Kaskade (zumindest nicht für mich).
So scheint, wie die einzige Lösung die ich habe ist zu tun, wählen Sie zuerst, und entfernen Sie jedes element separat. Was nicht scheint mir falsch zu sein.
Ist jemand eine bessere Idee, wie das zu tun, bulk löschen? Ist es tatsächlich besser Weg?
Wenn es hilft bin ich mit eclipselink 2.5.2.
Können Sie einen
ON DELETE
Einschränkung in Ihrer Datenbank?InformationsquelleAutor user902383 | 2015-03-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Optionen sind:
und Aufruf von em.entfernen Sie auf jeden
CASCADE" - Datenbank die option gesetzt, so dass die Datenbank-Kaskade die
löschen Sie für Sie. EclipseLink hat ein @CascadeOnDelete Anmerkung,
lässt Sie wissen, die "ON DELETE CASCADE" gesetzt ist, auf eine Beziehung, oder
erstellen Sie bei Verwendung von JPA für die DDL-Generierung: http://eclipse.org/eclipselink/documentation/2.5/jpa/extensions/a_cascadeondelete.htm
InformationsquelleAutor Chris
Wenn Sie wirklich über die Zeit, die es braucht, um führen Sie diese bulk-löschen, schlage ich vor, Sie JPQL löschen Ihre Entitäten. Wenn Sie ein Problem
DELETE
JPQL-Abfrage, es wird direkt ein Problem löschen, die auf diese Entitäten abrufen, ohne dass Sie in den ersten Platz.Können Sie selbst tun, bedingte löscht basierend auf einigen Parametern, die auf diese Entitäten mithilfe von Query API-wie unten
executeUpdate
zurück, die Anzahl der gelöschten Zeilen, sobald der Vorgang abgeschlossen ist.Wenn Sie haben die richtige cascading geben Sie in Ihre Entitäten wie
CascadeType.ALL
(oder)CascadeType.REMOVE
, dann ist die obige Abfrage wird der trick für Sie.Für mehr details, schauen Sie auf diese und diese.
Danke für den Zeiger. Gut zu wissen 🙂
InformationsquelleAutor Arkantos
JPQL
BULK DELETE
(ob mit string-basierten JPQL oder mit Hilfe von Kriterien (JPQL) ist nicht vorgesehen, Kaskade (ich.e Folgen Sie den cascade-type-Einstellungen für Felder). Wenn Sie möchten, cascading dann haben Sie entweder den datenspeicher verwenden echteFOREIGN KEY
s, oder Sie ziehen sich zurück, die Objekte zu löschen und AnrufEntityManager.remove()
.fügen Sie eine FOREIGN KEY-Einschränkung in Ihrer RDBMS-Tabelle Definitionen und können diese "ON DELETE CASCADE"
EntityManager.remove()
ist keine gute Idee, wenn Sie löschen müssen, um so viele Personen, weil Sie unnötig laden diejenigen stellen, nur um in der Lage zu nennen, entfernen Sie auf jeden einzelnen von Ihnen. Verwendung von JPQL, können Sie leicht vermeiden, dieselect
Abfragen und Reduzierung der Roundtrips zum db-server 🙂Ich habe definiert FKs für jede Entität, sind Sie in meinem schema, aber auch wenn ich`CascadeType.ENTFERNEN` auf Bezug, auf dem schema habe ich
ON DELETE NO ACTION
jpql klingt wie eine gute Idee. aber es ist nicht cascade.
InformationsquelleAutor Neil Stockton