728x90
반응형
CASCADE
- 영속성 전이라고 한다.
- 연관된 엔티티를 같이 영속화 하는 기능이다.
- 연관관계 맵핑이랑 전혀 상관이 없다.
CASCADE를 안쓰는 경우
- Parent 가 Child를 List 로 가지고 있을경우 일반적일때는
- Parent도 persist 를 해줘야 하고 child도 persist를 해줘야 한다.
코드
지금까지 배운 내용을 보면 당연하다.
parent 도 영속성 컨텍스트로 넣어주고
child1, child2 도 영속성 컨텍스트로 넣어줘야 한다.
@Entity
public class Parent {
@Id
@GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
// cascade 를 해주면 child는 알아서 저장된다.
// collection안에 있는 것들에도 persis를 날려 줄거야
// cascade: 이것이 연쇄이다.
// orphanRemoval: 컬렉션의 아이템 삭제시 delete 쿼리 발생
@OneToMany(mappedBy = "parent")
private List<Child> childList = new ArrayList<>();
}
main 코드
Child child1 = new Child();
Child child2 = new Child();
Parent parent = new Parent();
parent.addChild(child1);
parent.addChild(child2);
// 저장시 persist 를 3번 호출해야 된다.
em.persist(parent);
em.persist(child1);
em.persist(child2);
CASCADE를 적용할 경우
- parent 가 child를 포함하고 있기 때문에
- cascade를 써주면 child 도 같이 적용이 된다.
- 결과에서 보면 자동으로 insert 문이 나가게 된다.
@Entity
public class Parent {
@Id
@GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
// cascade 를 해주면 child는 알아서 저장된다.
// collection안에 있는 것들에도 persis를 날려 줄거야
// cascade: 이것이 연쇄이다.
// orphanRemoval: 컬렉션의 아이템 삭제시 delete 쿼리 발생
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Child> childList = new ArrayList<>();
}
Child child1 = new Child();
Child child2 = new Child();
Parent parent = new Parent();
parent.addChild(child1);
parent.addChild(child2);
// 저장시 persist 를 1번만 호출해도 된다
em.persist(parent);
//em.persist(child1);
//em.persist(child2);
결과
Hibernate:
/* insert cascade.Parent
*/ insert
into
Parent
(name, MEMBER_ID)
values
(?, ?)
Hibernate:
/* insert cascade.Child
*/ insert
into
Child
(name, parent_id, id)
values
(?, ?, ?)
Hibernate:
/* insert cascade.Child
*/ insert
into
Child
(name, parent_id, id)
values
(?, ?, ?)
CASCADE 종류
여러종류가 있지만 두개를 거의 많이 쓴다.
- ALL 모두 적용: Life cycle 다 맞출때 쓴다.
- PERSIST 영속 적용 : 저장할때만 쓴다.
주의점
- 다른 곳에 child 가 연관관계가 있을 경우 사용하면 안된다.
- parent 말고 다른 곳에서 child를 연관관계로 맵핑하고 있다면 사용하면 안된다.
고아객체
- 연관 관계가 끊어진 엔티티를 자동으로 삭제한다.
- orphanRemoval = true 를 해주면
- parent에 있는 컬렉션에서 child 아이템을 삭제하면 child에 대한 delete 쿼리가 나간다. - parent가 삭제되면 child도 자동으로 삭제 된다.
중요점
- child의 생명주기를 parent 에서 관리하는것이다.
728x90
반응형
'DataBase > JPA' 카테고리의 다른 글
[JPA] 값타입 컬렉션 (0) | 2021.09.17 |
---|---|
[JPA] 값타입 (0) | 2021.08.22 |
[JPA] Lazy 와 Eager (0) | 2021.08.19 |
[JPA] 프록시 (0) | 2021.08.11 |
[JPA] @MappedSuperclass (0) | 2021.08.09 |
댓글