2016-07-31 2 views
0

CascadeType.ALL과 함께 OneToMany 관계 (양방향)로 JPA를 사용하는 것에 대한 질문이 있습니다. CascadeType.ALL을 사용 OneToMany 관계 지속, 블라드 포스트 (https://vladmihalcea.com/a-beginners-guide-to-jpa-and-hibernate-cascade-types/)에 내놓고, 또한 내 경우에는,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에 CascadeType.All가 있더라도, 항상 양쪽의주의를 기울여야한다 그는 관계 측면의 소유자입니까?

답변

0

매우 다른 두 가지 개념을 혼합합니다.

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

를 내가 확인하고 싶었 기 때문에 나는 전형적인 setDetails보다는 addDetails을 사용주의 PostPostDetails 사이의 관계가 초기화되었습니다.

희망이 있습니다.

+0

고마워요. 나는 그것을 알아 채지 못했다. 귀하의 대답은 제 질문에 대한 의심을 제거하는 데 도움이되었습니다. – allowMeWeb

관련 문제