So löschen Sie Entitäten mit JOINs mit JPA und Hibernate

10

Ich habe folgende Entitäten:

Ich möchte WordSet mit der ID und dem Benutzernamen des Benutzers mit JPA löschen.

Hier sind Entitätsdeklarationen:

Benutzer

%Vor%

UserDictionary

%Vor%

WordSet

%Vor%

Hier ist ein Teil meines WordSetDao:

%Vor%

findByIdAndUsername funktioniert einwandfrei, aber delete löst folgende Ausnahme aus:

%Vor%

Auch statt

DELETE FROM WordSet w WHERE w.userDictionary.user.username = :username AND w.id = :id

Ich habe folgende Abfrage versucht:

%Vor%

Und es funktioniert auf meiner H2-Datenbank, schlägt aber bei MySQL mit folgender Ausnahme fehl:

%Vor%

Ich habe über Unterabfragen und MySQL gegoogelt ( one , zwei ), konnte aber nicht herausfinden, wie man einen solchen Trick mit JPA macht.

Also, wie Wordset zu löschen? Stimmt etwas mit meiner Entitätszuordnung nicht?

Hier ist mein DB-Schema, es sieht korrekt aus:

    
solomkinmv 13.06.2017, 20:51
quelle

3 Antworten

8

Es gibt einige Dinge, die in diesem Mapping falsch sind:

  1. Die Verwendung des EAGER-Abrufs für jeden Sammlertyp ist noch mehr ein Problem als das aktuelle Problem. Sie holen praktisch die gesamte Datenbank mit einer beliebigen Abfrage ab. Wechseln Sie zu LAZY, wie in diesem Artikel beschrieben.
  2. Sie sagten, es funktioniert für H2, aber das stimmt nicht:

    %Vor%
  3. Dieser Abfragetyp wird von MySQL nicht unterstützt:

    %Vor%
  4. Joins sind in Bulk-Anweisungen verboten, wie in Hibernate Benutzerhandbuch .
  5. Abhängig von der Anzahl der Einträge, die Sie löschen möchten, können Sie jetzt Batch löschen könnte ein besserer Ansatz sein, da Sie verhindern können, dass die Update-Anomalie verlorengeht .
  6. Sie haben hier ein Diagramm miteinander verbundener Entitäten, daher kann Ihnen das Massenlöschverfahren sowieso nicht helfen, da Sie einen übergeordneten Datensatz nicht löschen können, ohne zuerst die untergeordneten Zuordnungen zu löschen.
Vlad Mihalcea 16.06.2017, 12:09
quelle
0
  

java.sql.SQLException: Sie können die Zieltabelle 'word_set' nicht für angeben   Aktualisierung in FROM-Klausel       unter com.mysql.jdbc.SQLError.createSQLException (SQLError.java:964) ~ [mysql-connector-java-5.1.40.jar! /: 5.1.40]

Diese Ausnahme wird verursacht, weil Sie in MySQL die selbe Tabelle, die Sie im SELECT-Teil verwenden, nicht ändern / löschen können. Hier dokumentiert dieses Verhalten Ссылка . Die Lösungen 1) verschachteln die Unterabfrage tiefer in eine From-Klausel oder 2) verbinden die Tabelle mit sich selbst

    
alexey semenyuk 13.06.2017 21:20
quelle
0

Haben Sie versucht, den Löschvorgang regelmäßig beizutreten? Es gibt eine ähnliche Frage hier: Löschen mit Join in MySQL

... zwar nicht über JPA, aber es gibt eine akzeptierte Antwort, die ein Beispiel für ein Join-basiertes Löschen zeigt, aber es scheint MySQL-spezifisch zu sein.

Der Trick besteht darin, die tatsächliche Tabelle in der delete-Klausel selbst anzugeben, nicht nur die from-Klausel, wenn Sie andere Tabellen haben, die über JOINs referenziert werden.

Ich bin nicht eingerichtet, JPA gegen mysql im Moment zu testen. JQL kann dies möglicherweise nicht verarbeiten, aber Sie könnten es wahrscheinlich mit einer systemeigenen Abfrage tun.

    
slambeth 21.06.2017 17:14
quelle

Tags und Links