2016-05-10 2 views
0

Ich habe die folgenden Einheiten. Ich möchte in der Lage sein, einen Benutzer zu löschen, und alle Einträge in der UserGroupMap, die diesen Benutzer enthalten, sollten ebenfalls gelöscht werden. Jedes Mal, wenn ich versuche, einen Benutzer zu löschen, der auch einen Eintrag in UserGroupMap hat, erhalte ich den folgenden Fehler. Eine übergeordnete Zeile kann nicht gelöscht oder aktualisiert werden: Eine Fremdschlüsseleinschränkung schlägt fehl Wie kann ich dieses Verhalten erreichen?Kaskade löschen mit ManyToMany Beziehung

@Entity 
public class User { 

    @Id 
    private Long id; 

    @Column 
    private String name; 

    @ManyToMany(mappedBy = "users", cascade = CascadeType.All) 
    private Set<Group> groups; 

} 


@Entity 
public class Group { 

    @Id 
    private Long id; 

    @Column 
    private String type; 

    @ManyToMany 
    @JoinTable(name = "UserGroupMap", 
      joinColumns = @JoinColumn(name = "groupId", referencedColumnName = "id"), 
      inverseJoinColumns = @JoinColumn(name = "userId", referencedColumnName = "id")) 
    private Set<User> users; 

} 
+1

Mögliche duplizieren - http://stackoverflow.com/q/1082095/5516322 – aviad

Antwort

0
@Entity 
public class User { 

    @Id 
    private Long id; 

    @Column 
    private String name; 

    @ManyToMany(mappedBy = "users", cascade = CascadeType.All, orphanRemoval=true) 
    private Set<Group> groups; 

} 

orphanRemoval Option das Löschen der Childs sollte behandeln

+0

gibt es keine orphanRemoval für ManyToMany – kittels

+0

Wenn Sie dann verwenden Hibernate @OnDelete Aktion für Sie nützlich sein würde. http://docs.jboss.org/hibernate/stable/annotations/api/org/hibernate/annotations/OnDelete.html @OnDelete (action = OnDeleteAction.CASCADE) – PeaceIsPearl

0

Sie sollten (Kaskade = CascadeType.REMOVE), um Ihre viele zu viele Beziehung hinzufügen

wie in diesem Beispiel

@ManyToMany(cascade=CascadeType.REMOVE) 
0

Von was ich verstehe, die Entitäten zu betrachten, sollte Group nicht t gelöscht werden und die User gehört zu einer Group.

Das bedeutet, dass die Entität Group die übergeordnete Seite ist. Wenn Sie die User entfernen, müssen Sie sie von der Group Seite entfernen.

Erstellen Sie eine Methode auf der Group Einheit namens "Entfernen", die einen User Parameter verwendet, der der Benutzer ist, den Sie entfernen möchten.

public void remove(User user) { 

    for(Iterator<User> iterator = users.iterator(); iterator.hasNext();) { 
     User removeUser = iterator.next(); 
     /* 
     * you can check here if the user is equal to the parameter user 
     * if equal remove 
     */ 
     if(removeUser.equal(user)) { 
      removeUser.setGroup(null); 
      iterator.remove(); 
     { 
    } 
} 
Verwandte Themen