我有這兩個實體類:JPA:在刪除級聯@OneToMany關係的EclipseLink
@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;
//...
}
和:
@Entity
@Table(name = "POST")
@XmlRootElement
public class Post implements Serializable {
// ...
@JoinColumn(name = "USERNAME", referencedColumnName = "USERNAME")
@ManyToOne
private User username;
//...
}
我必須連接到同一個用戶的一些帖子。如果我刪除其中一個,它的工作原理正確。但是當我嘗試從數據庫中刪除該用戶(使用EntityManager)時,我得到了java.sql.SQLIntegrityConstraintViolationException外鍵違例限制。 當用戶(他們的外鍵)被刪除時,有沒有辦法刪除所有帖子?只需一個ON DELETE CASCADE
SQL語句。 我正在使用Derby(Java DB)和EclipseLink。從JPA Extensions for EclipseLink添加@CascadeOnDelete
註釋是我嘗試過的最後一件事,根本沒有成功。
編輯: 這是我使用用於去除用戶的代碼(it'sa 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();
}
而且,在超:
public void remove(T entity) {
getEntityManager().remove(getEntityManager().merge(entity));
}
由於您具有cascade = ALL,所以它應該自動發生。刪除用戶應刪除其帖子。你的代碼是什麼? –
在這種情況下,您可能有其他外鍵指向您要刪除的用戶。閱讀錯誤消息:它應該提及外鍵名稱。 –
如果您指定CascadeOnDelete註釋,您是使用JPA創建表,還是自己將ON DELETE CASCADE添加到Post表約束?此註釋告訴EclipseLink數據庫將刪除引用的Post實體,因此它不會,並且可能導致您的異常。 – Chris