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 und cascade 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.

InformationsquelleAutor Armando | 2015-04-19
Schreibe einen Kommentar