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));
}
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? –
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. –
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