2021. 2. 11. 17:27ㆍ프로그래밍 언어/Spring Framework
[인프런 김영한] JPA - 영속성전이(CASCADE)
해당 글은 인프런 김영한강사님의 영상을 보고 정리한 글입니다.
Spring Boot, Spring Data JPA를 사용해 실습하였습니다.
김영한 인프런 : www.inflearn.com/users/@yh
▣ 영속성전이(CASCADE)
* 특정 Entity를 영속 상태로 만들 떄 연관된 Entity도 함께 영속상태로 만들고 싶을 때.
- 부모(1) Entity를 저장 할 때 자식(*) Entity도 함께 저장하고 싶을 때.
◈ 영속성전이 주의사항
* 영속성 전이는 연관관계 매핑하는것과 아무 관련이 없음.
- Entity를 영속화 할 때 연관된 Entity도 함께 영속화하는 편리함을 제공할뿐임.
* 다른 Entity가 Child와 연관이 있으면 해당 CASCADE를 사용하면 안된다.
- Parent와 Child의 LifeCycle이 동일할때 (등록,삭제 등) 사용하기
- 단일 Entity에 완전히 종속적일 때 사용하면 괜찮다.
◈ CASCADE 옵션
- ALL : 모두 적용
- PERSIST : 영속
- REMOVE : 삭제
- MERGE : 병학
- REFRESH : refresh
- DETACH : detach
Parent
@Entity
public class Parent {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "parent")
private List<Child> childList = new ArrayList<>();
public void addChild(Child child){
childList.add(child);
child.setParent(this);
}
}
Child
@Entity
public class Child {
@Id
@GeneratedValue
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "parent_id")
private Parent parent;
}
▣ 실행
Child child1 = new Child();
Child child2 = new Child();
Parent parent = new Parent();
parent.addChild(child1);
parent.addChild(child2);
parentRepository.save(parent);
childRepository.save(child1);
childRepository.save(child2);
// 실행 쿼리
Hibernate:
insert
into
parent
(name, id)
values
(?, ?)
Hibernate:
call next value for hibernate_sequence
Hibernate:
insert
into
child
(name, parent_id, id)
values
(?, ?, ?)
Hibernate:
call next value for hibernate_sequence
Hibernate:
insert
into
child
(name, parent_id, id)
values
(?, ?, ?)
| Parent 중심으로 개발하고 싶은데 Parent를 저장할 때 함께 Child도 함께 저장하고 싶다고 생각하실 수 있습니다.
이 때 사용하는데 CASCADE 입니다.
◈ 수정
Parent
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
private List<Child> childList = new ArrayList<>();
▣ 실행
Child child1 = new Child();
Child child2 = new Child();
Parent parent = new Parent();
parent.addChild(child1);
parent.addChild(child2);
parentRepository.save(parent);
// childRepository.save(child1);
// childRepository.save(child2);
// 실행 쿼리
Hibernate:
insert
into
parent
(name, id)
values
(?, ?)
Hibernate:
insert
into
child
(name, parent_id, id)
values
(?, ?, ?)
Hibernate:
insert
into
child
(name, parent_id, id)
values
(?, ?, ?)
| @OneToMany의 옵션에 cascade = CascadeType.ALL을 설정하면 Parnet를 저장할 때 Child도 함께 저장됩니다.
Parent
'프로그래밍 언어 > Spring Framework' 카테고리의 다른 글
[인프런 김영한] JPA - 값 타입과 불변 객체 (0) | 2021.02.12 |
---|---|
[인프런 김영한] JPA - 임베디드 타입(복합 값 타입) (0) | 2021.02.12 |
[인프런 김영한] JPA - 즉시로딩 / 지연로딩 (0) | 2021.02.11 |
[인프런 김영한] JPA - 프록시 (0) | 2021.02.10 |
[인프런 김영한] JPA - @MappedSuperclass (0) | 2021.02.09 |