2016-07-31 24 views
0

CascadeType.ALLと一緒にOneToMany関係(双方向)でJPAを使用することに関する質問があります。ヴラドのポスト(https://vladmihalcea.com/a-beginners-guide-to-jpa-and-hibernate-cascade-types/)に基づか、CascadeType.ALLを使用してOneToManyの関係に固執、またJPA OneToManyはCascadeType.ALLで永続化しません。子は永続しません。

Post post = new Post(); 
post.setName("Hibernate Master Class"); 

Comment comment1 = new Comment(); 
comment1.setReview("Good post!"); 
Comment comment2 = new Comment(); 
comment2.setReview("Nice post!"); 

post.addComment(comment1); 
post.addComment(comment2); 

session.persist(post); 

を持続しなければならない。しかし、私の場合:私は、エンティティの両側をリンクする際

//Entity SharedAdvertisementKey 
@ManyToOne 
@JoinColumn(name="SHARED_AD_ID", nullable=false) 
private SharedAdvertisement sharedAdvertisement; 

//Entity SharedAdvertisements 
@OneToMany(mappedBy="sharedAdvertisement", cascade=CascadeType.ALL) 
private List<SharedAdvertisementKey> sharedAdvertisementKey = new ArrayList<>(); 

それだけで働いています関係の所有者を永続化する前に:

sharedAdvertisementKey.setSharedAdvertisement(sharedAdvertisement); 
sharedAdvertisement.addSharedAdvertisementKey(sharedAdvertisementKey); 

だから、主な質問は:私はトンのCascadeType.Allがある場合でも、必ず両側の世話をする必要があります彼は関係側の所有者ですか?

答えて

0

非常に異なる2つの概念を混在させています。

CascadeTypeは、リレーションにカスケードするアクションを扱います。 CascadeType.ALLを指定するときは、永続性プロバイダに、そのエンティティを永続化、マージ、または削除するたびに、それらのアクションをリレーションにレプリケートするように指示します。

しかし、カスケード操作を機能させるには、関係が正しく管理されていることを確認する必要があります。あなたがVladの投稿を見ると、Postに2つの非常に重要なメソッドがあります。

public void addDetails(PostDetails details) { 
    this.details = details; 
    details.setPost(this); 
} 

public void removeDetails() { 
    this.details.setPost(null); 
    this.details = null; 
} 

これらの方法はPostDetailsPostとの関係が適切にあなたの要件に基づいて維持されていることを確認してください。だから、次のマッピングを仮定:

public class Post { 
    @OneToOne(cascade = CascadeType.ALL, mappedBy = "post", orphanRemoval = true) 
    private PostDetails details; 
} 

次のようにあなたがそれらの両方の永続性操作を実行できます。

PostDetails details = new PostDetails(); 
details.setUser(currentUser); 
Post post = new Post(); 
post.addDetails(details); 
session.persist(post); 

あなたは、私が確認したかったので、私はむしろ典型的なsetDetailsよりaddDetailsを使用気づきますPostPostDetailsの間の関係が初期化されていること。

希望に役立ちます。

+0

ありがとうございます。私はそれに気付かなかった。あなたの答えは、私の質問に関して疑問を取り除くのを助けました。 – allowMeWeb

関連する問題