inflearn logo
강의

講義

知識共有

Java ORM標準JPAプログラミング - 基本編

バルク演算

연관관계 주인과 cascade가 상충되는 상황에 대해서

解決済みの質問

505

meean2003

投稿した質問数 19

0

제가 알고 있기론 연관관계 주인만 엔티티 수정이 가능하고 아니면 조회만 가능하다고 알고 있습니다.

@OneToMany(mappedBy = "team") 
private List<Member> members = new ArrayList<>();

이 코드에서 team은 member을 조회만 할수 있습니다.

Team team = new Team(); 
team.setName("TeamA"); 
em.persist(team);

Member member = new Member();

//역방향(주인이 아닌 방향)에서 멤버 추가 시도 
team.getMembers().add(member); //실패!

 

그러나 cascade 또는 고아 객체 제거 옵션을 사용하면 부모 엔티티를 통해 자식 엔티티의 생명주기를 컨트롤 할 수 있다고 배웠습니다.

@Entity 
public class Parent { 

    @Id @GeneratedValue 
    private Long id; 

    @OneToMany(mappedBy = "parent", cascade = CascadeType.PERSIST) 
    List<Child> childList = new ArrayList<>(); 

}
Child child1 = new Child(); 
Child child2 = new Child(); 

Parent parent = new Parent(); 

child1.setParent(parent); //연관관계 추가 
child2.setParent(parent); //연관관계 추가 

parent.getChildList().add(child1); 
parent.getChildList().add(child2); 

//부모 저장, 연관된 자식들 저장 
em.persist(parent);

 

두 개념이 서로 충돌하는것 같은데 어떻게 동작하는 것일까요?

 

java jpa

回答 1

2

shinjw0926

양방향 연관관계에서 연관관계의 주인은 외래키를 관리하고, 아닌 쪽은 조회만 가능합니다.

Parent에서 아무리 child를 add해도 외래키 값은 저장되지 않습니다.

 

영속성 전이(cascade)는 특정 엔티티의 영속성(persist, remove, detach 등등..)을 수정할 때 연관된 엔티티도 같이 수정하겠다는 뜻입니다.

 

@OneToMany(mappedBy = "parent", cascade = CascadeType.PERSIST)

위 코드를 보시면 연관관계 주인은 Child클래스의 parent이고, Parent클래스를 영속화할 때 Child도 같이 영속화 하겠다는 뜻입니다.

 

올려주신 코드를 보면 child1, child2객체(각각 연관관계의 주인입니다.)에 parent를 set해주므로 외래키가 저장되는 것이며, parent객체(영속성 전이)를 영속화할때 child1, child2객체가 모두 영속화되어 결과적으로 DB에는 총 3개의 데이터(parent, child1, child2)가 INSERT됩니다.

 

child1.setParent(parent); //연관관계 추가

child2.setParent(parent); //연관관계 추가

위 코드를 삭제하시면 연관관계의 주인에 연관관계가 세팅되지 않으므로 외래키값은 null로 입력되는 것을 확인할 수 있으실겁니다.

0

meean2003

그렇다면, cascade나 고아 객체 삭제 옵션은 외래키를 설정하는 연관관계 매핑과 무관하게, 단순히 연관된 객체를 영속 상태로 편리하게 바꿔주는 역할을 하는 거군요! 답변 감사합니다!

실무 조언 관련 질문입니다.

0

41

1

H2데이터베이스 파일 생성

0

50

2

서브쿼리 강의에서 ALL 예시 관련 질문드립니다.

0

49

2

수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?

0

48

1

JPQL 메소드와 락

0

52

1

Delivery @OneToOne

0

57

1

17강 4~5분대 테이블 값 조회가 안됩니다.

0

89

2

UnsupportedOperationException 발생

0

82

3

H2 Database 연결이 안됩니다.

0

87

2

연관관계 매핑 질문드립니다.

0

82

2

h2데이터베이스 실행오류

0

105

2

persistence.xml

0

103

2

양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?

0

77

1

영속성 컨텍스트

0

62

1

JPA 프록시

0

89

1

Native Query와 MyBatis

0

63

1

영속성 컨텍스트는 어떤 메모리에 저장되는건가요?

0

82

1

임베디드 타입 예시 코드 관련 질문

0

112

3

명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요

0

90

3

인텔리제이 패키지 커서 단축키 질문

0

106

2

혹시 현재는 ID 데이터 타입이 String이면 안되나요?

0

136

1

양방향 연관관계 시 연관관계 주인을 설정하는 이유

0

68

1

임베디드 타입과 MappedSuperClass의 차이점이 궁금합니다.

0

95

1

데이터베이스가 초기화되는 것 같아요

1

177

2