JPA CascadeType.ENTFERNEN funktioniert nicht
Habe ich zwei Entitäten Business welche aus einer Liste von Abteilungen
@Entity
@Table(name = "Business")
public class Business implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "Id")
private Long id;
@OneToMany(mappedBy = "business",
cascade = {CascadeType.PERSIST, CascadeType.REMOVE})
private List<Department> departments;
@OneToMany(mappedBy = "business", orphanRemoval = true,
cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE})
private List<Process> processs;
@ManyToMany
private List<Competence> competences;
}
@Entity
@Table(name = "Department")
public class Department implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "father",
cascade = {CascadeType.PERSIST, CascadeType.REMOVE})
private List<Department> departments;
}
Wenn ich versuche zu löschen, ein business-Instanz bekomme ich einen Mysql-Ausnahme
Nicht löschen oder update a parent row: a foreign key constraint fails (evac_java
.Department
, EINSCHRÄNKUNG FK_Department_Business
FOREIGN KEY (Business
) REFERENZEN Business
(Id
)):HY000 - null
Was bedeutet, ich kann nicht löschen Sie die business-Instanz, denn es hat Abteilungen zugeordnet, sondern ein department nicht vorhanden ist, von selbst, so will ich löschen aller Unternehmens-Abteilungen, wenn es wieder entfernt werden. Ich dachte, ich würde erreichen dies, indem Sie cascade = CascadeType.ENTFERNEN Sie die @OneToMany-annotation in der business entity, aber es funktioniert nicht.
Ich habe eine Suche auf dem Netz und ich fand eine Menge von Fragen, die ähnlich wie diese auf stackoverflow, aber Sie alle schlagen die gleiche: add cascade = CascadeType.ENTFERNEN oder CascadeType.ALLE
So Frage ich mich, wenn ich bin fehlt somethig.
Ich bin mit Glassfish 4.1 und EclipseLink
Habe ich versucht mit
@OneToMany(mappedBy = "business", orphanRemoval = true)
private List<Department> departments;
auf die Unternehmen, aber es funktioniert entweder nicht
Hier ist die Methode, die ich verwende zum entfernen von entities, die deklariert ist, in eine abstrakte Klasse
public void remove(T entity) {
getEntityManager().remove(getEntityManager().merge(entity));
}
- ich denke, Sie sollten hinzufügen, orphanremoval =true head der Liste, die Sie entfernen möchten Artikel
- Ich habe diese option erwägen, aber ist das nicht redundant mit CascadeType.ENTFERNEN und auch aggressiver? und in diesem Fall sollte es tun, aber was, wenn ich nicht zu entfernen brauchen die Kinder?
- wenn es onetomany-relation bedeutet, dass Kinder können nicht existieren, ohne fatherclass.also, wenn Sie entfernen, die Vater-Klasse ist es bedeutet, dass müssen Sie entfernen Verwandte Elemente oder update zugehörigen Spalte null
- stackoverflow.com/questions/18813341/...
- Haben Sie versucht, mit beiden
orphanRemoval
undcascade
Optionen? Orphan removal sagt einfach zu löschen verwaiste Zeilen (das ist das Verhalten, das Sie möchten) und die cascade-option einfach sagt auslösen, die zu löschen, wenn die besitzende Seite gelöscht wird. Hast du irgendwelche extra FKs definiert, außer dem, was Sie hier haben? Was bedeutet die DDL generiert Aussehen und welche JPA-Implementierung? - Ich habe versucht, sowohl die orphanRemoval und cascade-Optionen. Ich bin mit JPA 2.0 with EclipseLink auf Glassfish 4.1. Ich bearbeitet meine Frage, zeigen die anderen Beziehungen.
- Auf die Datenbank der FK FK_Department_Business in die Department-Tabelle, die Referenzen Business.Id heißt es AUF LÖSCHEN -> BESCHRÄNKT und AUF UPDATE -> BESCHRÄNKT. Offensichtlich ist es nicht generationg richtig
- Haben Sie überprüft, dass Ihre Sammlung von Abteilungen innerhalb Ihres Unternehmens Instanz hat Abteilungen, wenn Sie Ihren Anruf zu entfernen, auf die Unternehmen? Der PPV kann nur entfernen und cascade remove über Personen, die es kennt, und wenn Sie nicht pflegen beide Seiten diese bidirektionale Beziehung Probleme wie diese entstehen. Wenn es leer ist, versuchen Sie, eine em.refresh() vor dem entfernen, zwingt PPV zu füllen alle Beziehungen so, dass Sie ordnungsgemäß entfernt, aber wenn es funktioniert, wären Sie besser dran, die Aufrechterhaltung der Beziehung.
- Das war es @Chris, wenn ein beibehalten der Fachbereich I seine Sache, aber ich habe nicht fügen Sie die neue Abteilung der business-Abteilung für die Liste. Wenn Sie Ihr Kommentar als eine Antwort werde ich es annehmen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
JPA können nur entfernen und cascade remove über Personen, die es kennt, und wenn Sie nicht pflegen beide Seiten diese bidirektionale Beziehung Probleme wie diese entstehen. Wenn die Sammlung-Abteilungen leer ist, versuchen Sie, eine em.refresh() vor dem entfernen, zwingt PPV zu füllen alle Beziehungen so, dass Sie ordnungsgemäß entfernt, aber es ist besser zu pflegen beide Seiten die Beziehung als änderungen sind zu vermeiden, die Datenbank-Treffer.