2016-07-31 85 views
0

我有關於與CascadeType.ALL一起使用JPA與OneToMany關係(雙向)的問題。基礎上弗拉德後(https://vladmihalcea.com/a-beginners-guide-to-jpa-and-hibernate-cascade-types/),在使用CascadeType.ALL一對多關係持續,也應該堅持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); 

所以今天的主要問題是:我應該照顧雙方始終,即使是在T A CascadeType.All他是關係方的所有者?

回答

0

你在混合兩個完全不同的概念。

A CascadeType處理級聯關係的行爲。指定CascadeType.ALL時,您告訴持久性提供者,無論何時持久化,合併或移除該實體,這些操作都將被複制到關係中。

但是爲了使級聯操作起作用,您必須首先確保關係管理正確。如果你看弗拉德的帖子,你會發現Post上有兩個非常重要的方法。

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); 

你注意到我用了addDetails而不是典型的setDetails,因爲我想確保初始化PostPostDetails之間的關係。

希望有所幫助。

+0

非常感謝。我沒有注意到這一點。你的回答幫助我消除了對我的問題的任何懷疑。 – allowMeWeb