Mysql
 sql >> Datenbank >  >> RDS >> Mysql

@OneToMany-Fehler in MySQL:Eine übergeordnete Zeile kann nicht gelöscht oder aktualisiert werden:Eine Fremdschlüsseleinschränkung schlägt fehl

Sie haben zwei Fehler.

Erster Fehler:Sie haben die bidirektionale Assoziation zwischen Header und Details zweimal abgebildet:einmal im Header und einmal in den Details. Wenn Sie eine bidirektionale Assoziation haben, muss eine der Seiten (in diesem Fall die eine Header-Seite) als die Umkehrung der anderen Seite deklariert werden, indem Sie mappedBy verwenden Attribut:

@OneToMany(fetch = FetchType.EAGER, orphanRemoval = true, mappedBy = "reminderHeader")
@Cascade(value = { CascadeType.SAVE_UPDATE, CascadeType.DELETE })
@Fetch(FetchMode.SELECT)
private Set<ReminderDetails> reminderDetailslist;

Zweiter Fehler:Die DELETE-Kaskade wird nur angewendet, wenn Sie Session.delete() verwenden Methode zum Löschen der Entität. Löschabfragen umgehen die Sitzung vollständig (was bedeutet, dass die Entitäten, die durch die Abfrage gelöscht, aber zuvor geladen wurden, in der Sitzung bleiben, in demselben Zustand, als ob keine Abfrage ausgeführt worden wäre).

Um die Löschung zu kaskadieren, müssen Sie also eine Auswahlabfrage ausführen, um alle zu löschenden Header zu finden, und dann diese Header durchlaufen und sie mit session.delete() löschen .