2016-05-01 117 views
0

我有這兩個實體類: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)); 
} 
+0

由於您具有cascade = ALL,所以它應該自動發生。刪除用戶應刪除其帖子。你的代碼是什麼? –

+0

在這種情況下,您可能有其他外鍵指向您要刪除的用戶。閱讀錯誤消息:它應該提及外鍵名稱。 –

+0

如果您指定CascadeOnDelete註釋,您是使用JPA創建表,還是自己將ON DELETE CASCADE添加到Post表約束?此註釋告訴EclipseLink數據庫將刪除引用的Post實體,因此它不會,並且可能導致您的異常。 – Chris

回答

0

我們可以嘗試添加ON DELETE SET NULL子句添加到POST表中的外鍵約束。當父表中的數據被刪除時,這將有助於將子表中的對應記錄設置爲NULL。因此,如果從用戶表中刪除用戶名值,則使用此用戶名的POST表中的相應記錄將將用戶名設置爲NULL。