2017-06-20 17 views
1

私はHibernateでSpringブート(最新バージョン1.5.4)を使用してペットプロジェクトに取り組んでおり、自分自身を理解できなかった問題を発見しました。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がDELETEにカスケードしないと、孤立したコメントレコードを削除しませんいくつかの理由。ただし、CascadeType.ALLをCascadeType.REMOVEに変更すると、親のPostが削除されたときにすべてが正常に動作し、それらのレコードが削除されます。

誰でもこの現象が発生している理由は知っていますか?それは私のコードのバグか何か間違っていますか?

答えて

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. 最後em.merge(managedPost)ためupdate post ...update comment ...(コメントにカスケード)

だから、最後の文は削除されたコメントを再挿入します。

削除または削除後に必ずem.flush()にするか、カスケードを削除する必要があります。

関連する問題