즉시 로딩(fetch = FetchType.EAGER)
- JPA 구현체는 가능하면 조인을 사용해 SQL 한번에 함께 조회
주의
- 실무에서 사용하면 안됨!
- 즉시 로딩 적용시 예상 치 못한 SQL 발생
- JPQL에서 N+1 문제 발생
- @ManyToOne, @OneToOne은 기본이 즉시 로딩
지연 로딩(fetch = FetchType.LAZY)
- 프록시로 가져옴
- 모든 연관관계에서 사용해라(실무)
- JPQL fetch 조인이나, 엔티티 그래프 기능을 사용해라!
- @OneToMany, @ManyToMany는 기본이 지연 로딩
영속성 전이
특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 떄
CASCADE 주의
- 연관관계 매핑하는 것과 관련없음
- 엔티티 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함 제공뿐
종류
- ALL : 모두 적용
- PERSIST : 영속
- REMOVE : 삭제
- MERGE : 병합
- REFRESH : REFRESH
- DETACH : DETACH
고아객체
부모 엔티티와 연관관계 끊어진 자식 엔티티를 자동으로 삭제
orphanRemoval = true
Parent parent = em.find(Parent.class, id);
parent.getChildren().remove(0);
주의
- 참조하는 곳이 하나일 때 사용해야 함!
- 특정 엔티티가 개인 소유할 때 사용
- @OneToOne, @OneToMany만 가능
- CascadeType.REMOVE 처럼 동작함
CasecadeType.REMOVE vs orphanRemoval=true
- 부모 객체가 삭제 되었을 때 자식도 함께 삭제되는 점은 동일
- 관계가 끊어진다면??
- orphanRemoval=true는 관계가 끊어진 자식을 자동으로 제거
- CasecadeType.REMOVE는 관계가 끊어진 자식을 자동으로 제거하지 않음
(관계가 끊어졌다는 것을 제거로 안봄)
영속성 전이 + 고아객체 - 생명주기
- CascadeType.ALL + orphanRemoval = true
- 스스로 생명주기 관리하는 엔티티는 em.persist()로 영속화, em.remove()로 제거
- 두 옵션 모두 활성화 하면 부모 엔티티를 통해 자식의 생명주기 관리가능
- 도메인 주도 설계(DDD)의 Aggregate Root 개념 구현할 때 유용