2016-07-31 62 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