Reference. 자바 ORM 표준 JPA 프로그래밍
책 목차 및 이전 글
더보기
들어가기 전 JPA 특징, Q&A
1. JPA 소개
3. 영속성 관리
4. 엔티티 매핑
4.1 - 4.3 @Entity, @Table, 다양한 매핑
4.4 - 4.5 데이터베이스 스키마 자동 생성, DDL 생성 기능
5. 연관관계 매핑 기초
6. 다양한 연관관계 매핑
7. 고급매핑
8. 프록시와 연관관계 관리
8.4 영속성 전이: CASCADE
- 연관된 엔티티도 함께 영속 상태로 만들고 싶으면 영속성 전이 기능을 사용
- JPA는 CASCADE 옵션으로 영속성 전이를 제공
- 영속성 전이를 사용하면 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장 가능
영속성 전이를 사용하지 않은 상태의 저장
- JPA에서 엔티티를 저장할 때 연관된 모든 엔티티는 영속 상태여야 저장 가능
부모 엔티티
@Entity
public class Parent {
@Id @GeneratedValue
private Long id;
@OneToMany(mappedBy = "parent")
private List<Child> children = new ArrayList<Child>();
...
}
자식 엔티티
@Entity
public class Child {
@Id @GeneratedValue
private Long id;
@ManyToOne
private Parent parent;
...
}
부모 자식 저장
private static void saveNoCascade(EntityManager em) {
//부모 저장
Parent parent = new Parent();
em.persist(parent);
//자식 저장
Child child1 = new Child();
child1.setParent(parent); //자식 -> 부모 연관관계 설정
parent.getChildren().add(child1); //부모 -> 자식
em.persist(child1);
...
}
8.4.1 영속성 전이: 저장
- 영속성 전이를 활성화하려면 CASCADE 옵션 적용 필요 (
cascade = CascadeType.PERSIST
)@Entity public class Parent { ... @OneToMany(mappedBy = "parent", cascade = CascadeType.PERSIST) private List<Child> children = new ArrayList<Child>(); ... }
CASCADE 저장 예제
Child child1 = new Child(); Parent parent = new Parent(); child1.setParent(parent); //연관관계 추가 parent.getChildren().add(child1); //부모 저장, 연관된 자식 저장 em.persist(parent);
- 영속성 전이는 연관관계 매핑과는 아무 관련이 없음 엔티티를 영속화할 때 연관 엔티티도 같이 영속화 하는 편리함을 제공
8.4.2 영속성 전이: 삭제
- 영속성 전이는 엔티티를 삭제할 떄도 사용 가능,
CascadeType.REMOVE
설정 필요
- 삭제 순서는 외래 키 제약조건 때문에 자식 먼저 삭제 후 부모 삭제
CasCadeType.REMOVE
를 설정하지 않으면 부모만 삭제 그러나 외래 키 제약 때문에 예외 발생
//기존 삭제 방법
Parent findParent = em.find(Parent.class, 1L);
Child findChild1 = em.find(Child.class, 1L);
em.remove(findChild1);
em.remove(findParent);
//영속성 전이를 통한 삭제 방법
Parent findParent = em.find(Parent.class, 1L);
em.remove(findParent);
8.4.3 CASCADE의 종류
- CascadeType 코드 옵션 종류
public enum CascadeType { ALL, //모두 적용 PERSIST, //영속 MERGE, //병합 REMOVE, //삭제 REFRESH, //REFRESH DETACH //DETACH }
- 여러 속성을 사용할 경우
casecade = {CascadeType.PERSIST, CascadeType.REMOVE}
사용
PERSIST
,REMOVE
는em.persist()
,em.remove()
실행시 전이 발생하지 않음 플러시(flush
) 호출할 때 전이 발생
8.5 고아 객체
- 고아 객체(
ORPHAN
) 제거: 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동 삭제하는 기능
- 부모 엔티티의 컬렉션에서 자식 엔티티의 참조만 제거하면 자식 엔티티가 자동으로 삭제
고아 객체 제거 기능 설정 및 사용
//고아 객체 제거 기능 설정 @Entity public class Parent { ... @OneToMany(mappedBy = "parent", orphanRemoval = true) private List<Child> children = new ArrayList<Child>(); ... } //사용 코드 Parent parent1 = em.find(Parent.class, id); parent1.getChildren().remove(0); //자식 엔티티를 컬렉션에서 제거 //실행 SQL DELETE FROM CHILD WHERE ID = ?
- 고아 객체 제거 기능은 영속성 컨텍스트를 플러시 할때 적용, 그때 DELETE SQL 실행
- 참조가 제거된 엔티티는 다른 곳에서 참조하지 않는 고아 객체로 보고 삭제하는 기능
- 참조하는 곳이 하나일 때만 사용해야 함, 삭제한 엔티티를 다른 곳도 참조하면 문제 발생 (@OneToOne, @OneToMany에서만 사용)
8.6 영속성 전이 + 고아 객체, 생명주기
- CascadeType.ALL + orphanRemoval = true를 동시에 사용하는 경우
- 엔티티 스스로 생명주기를 관리하는 의미
- 부모 엔티티를 통해서 자식의 생명주기를 관리하는 것이 가능
- 자식을 저장하려면 부모에 등록
Parent parent = em.find(Parent.class, parentId); parent.addChild(child1);
- 자식을 삭제하려면 부모에서 제거
Parent parent = em.find(Parent.class, parentId); parent.getChildren().remove(removeObject);
'개발서적 > 자바 ORM 표준 JPA' 카테고리의 다른 글
[자바 ORM 표준 JPA 프로그래밍] 9.3~5 값 타입과 불변 객체, 값 비교, 값 타입 컬렉션 (0) | 2021.09.13 |
---|---|
[자바 ORM 표준 JPA 프로그래밍] 9.1~2 기본값 타입, 임베디드 타입 (0) | 2021.08.25 |
[자바 ORM 표준 JPA 프로그래밍] 8.3 지연 로딩 활용 (0) | 2021.08.25 |
[자바 ORM 표준 JPA 프로그래밍] 8.1~2 프록시, 즉시 로딩과 지연 로딩 (0) | 2021.08.25 |
[자바 ORM 표준 JPA 프로그래밍] 7.5 엔티티 하나에 여러 테이블 매핑 (0) | 2021.08.18 |