2017-06-20 102 views
1

我正在使用Spring Boot(最新版本1.5.4)與Hibernate進行一個寵物項目,並且遇到了一個無法弄清楚自己的問題。JPA CascadeType.ALL不刪除兒童孤兒記錄

我正嘗試在帖子和評論之間創建OneToMany關係。

父類:

@NotNull 
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER, mappedBy = "parentPost") 
private Set<Comment> commentList; 

子類:

@ManyToOne 
    @JoinColumn(name="parent_id") 
    @JsonBackReference 
    private Post parentPost;  

出於某種原因CascadeType.ALL不ON DELETE CASCADE和不刪除孤兒評論記錄。但是,如果我將CascadeType.ALL更改爲CascadeType.REMOVE,則一切都將正常工作,並且在父郵件被刪除時這些記錄將被刪除。

有誰知道我爲什麼會得到這種行爲?是我的代碼中的錯誤或錯誤嗎?

回答

0

可能是一個聲明順序錯誤。

假設:

// find a post and manage it 
Post managedPost = em.find(postId); 

// get a random comment - the first one 
Comment comment = managedPost.getCommentList().iterator().next(); 

// unlink the comment from the post 
managedPost.getCommentList().remove(comment); 

// remove the comment from the db 
em.remove(comment); 

// do other things 
.... 

// do an useless merge on a already managed post 
em.merge(managedPost); 

提供者將緩存的語句(只是一個概念,不要把他們作爲真正的):

  1. select post ...em.find(postId)
  2. delete from comment ...managedPost.getCommentList().remove(comment)
  3. 另一個delete from comment ...em.remove(comment)(忽略爲d uplicate)
  4. update post ...update comment ...最後em.merge(managedPost)(級聯到評論)

所以,最後的聲明將重新插入刪除評論。

刪除或刪除級聯後,您必須確保em.flush()