2016-05-01 14 views
0

Ich habe diese beiden Entitätsklassen:JPA: Auf Lösch Kaskade @OneToMany Beziehung Eclipse

@Entity 
@Table(name = "USER") 
@XmlRootElement 
@CascadeOnDelete 
public class User implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @Basic(optional = false) 
    @NotNull 
    @Size(min = 1, max = 15) 
    @Column(name = "USERNAME") 
    private String username; 
    //... 
    @OneToMany(mappedBy = "username", cascade = CascadeType.ALL, orphanRemoval=true) 
    @CascadeOnDelete 
    private Collection<Post> postCollection; 
    //... 
} 

Und:

@Entity 
@Table(name = "POST") 
@XmlRootElement 
public class Post implements Serializable { 
    // ... 
    @JoinColumn(name = "USERNAME", referencedColumnName = "USERNAME") 
    @ManyToOne 
    private User username; 
    //... 
} 

Ich habe einige Beiträge zu den gleichen Benutzer angebracht. Wenn ich einen von ihnen lösche, funktioniert es richtig. Aber wenn ich versuche, diesen Benutzer aus der DB (mit dem EntityManager) zu löschen, bekomme ich java.sql.SQLIntegrityConstraintViolationException Fremdschlüsselverletzung Beschränkung. Gibt es eine Möglichkeit, alle Posts zu löschen, wenn der Benutzer (ihr Fremdschlüssel) gelöscht wird? Einfach eine ON DELETE CASCADE SQL-Anweisung. Ich benutze Derby (Java DB) und EclipseLink. Das Hinzufügen dieser @CascadeOnDelete Annotationen von JPA Extensions für EclipseLink ist das letzte, was ich versucht habe, ohne Erfolg.

EDIT: Dies ist der Code, den ich zum Entfernen eines Benutzers verwenden (es ist ein REST-API)

@DELETE 
@Path("{id}") 
public Response remove(@PathParam("id") String id) { 
    User u; 
    if((u = super.find(id)) == null) 
     return Response.status(Response.Status.NOT_FOUND).build(); 
    super.remove(u); 
    return Response.status(Response.Status.NO_CONTENT).build(); 

} 

Und in der Oberklasse:

public void remove(T entity) {  
    getEntityManager().remove(getEntityManager().merge(entity)); 
} 
+0

Mit der Zuordnung, die Sie haben, sollte es automatisch geschehen, da Sie cascade = ALL haben. Entfernen des Benutzers sollte seine Beiträge entfernen. Was ist dein Code? –

+0

In diesem Fall haben Sie wahrscheinlich andere Fremdschlüssel, die auf den Benutzer zeigen, den Sie löschen möchten. Lesen Sie die Fehlermeldung: Sie sollte den Namen des Fremdschlüssels angeben. –

+0

Wenn Sie die CascadeOnDelete-Annotation angeben, verwenden Sie JPA, um Ihre Tabellen zu erstellen, oder haben Sie die ON DELETE CASCADE selbst zur Einschränkung der Post-Tabelle hinzugefügt? Diese Annotation teilt EclipseLink mit, dass die Datenbank die referenzierten Post-Entities entfernt, was nicht der Fall ist und zu Ihrer Exception führen kann. – Chris

Antwort

0

Können wir versuchen Sie, den ON DELETE SET NULL-Klausel für die Fremdschlüsseleinschränkung in der POST-Tabelle. Dies würde helfen, die entsprechenden Datensätze in der Kindtabelle auf NULL zu setzen, wenn die Daten in der Elterntabelle gelöscht werden. Wenn also ein Benutzername-Wert aus der Benutzertabelle gelöscht wird, wird für die entsprechenden Datensätze in der POST-Tabelle, die diesen Benutzernamen verwenden, der Benutzername auf NULL gesetzt.

Verwandte Themen