프록시
실제 클래스를 상속받아서 만들어진 가짜 객체
객체를 DB에서 찾을 때와는 다르게 em.persist()
가 아닌 em.getReference()
를 이용해서 조회를 한다 메서드명에서 보는거와 같이 무언가(실제 객체)를 참조를 하고 있는 객체이다
프록시 객체는 getXXX()처럼 실제로 처음 사용이 될때 값이 초기화가 된다
이미 영속성 컨텍스트에 찾는 객체가 있으면 실제 엔티티 반환된다
초기화 과정
- getXXX()처럼 실제로 사용
- 영속성 컨텍스트에 초기화 요청
- DB조회
- 실제 Entity생성
- 실제 객체를 참조하고 있는 target.getXXX()실행
org.hibernate.Hibernate.initialize(프록시객체);
을 이용하여 강제로 직접 초기화 할 수 있다
즉시로딩 지연로딩
설정 방법
@XXXToXXX(fetch = FetchType.EAGER)
- 즉시로딩
@XXXToXXX(fetch = FetchType.LAZY)
- 지연로딩
즉시로딩
해당 객체를 조회하면 참조하는 객체도 같이 JOIN문을 이용하여 한번에 조회
이때 JOIN은 Left outter join(선택적 관계로 적용)이 이용된다
left outer join이 아닌 inner join을 사용을 원한다면 아래 두 코드중 하나를 선택하여 사용하면 된다
@ManyToOne(fetch = EAGER, optional = false)
@JoinColumn(nullable = false)
지연로딩
해당 객체를 조회하면 fk로 참조하는 객체는 조회하지 않고 나중에 실제로 사용시 조회
이때 참조하는 객체는 프록시 객체로 초기화 되지 않은 상태로 넣어둔다
기본 패치 전략
@XXXToOne
- 즉시로딩@XXXToMany
- 지연로딩
영속성 전이
DataBase를 공부할 때 참조 무결성 조건을 지키기 위해서 사용한 on delete cascade
와 같다고 생각 하면된다
on delete cascade
는 참조되는 테이블에서 행이 삭제되면 참조 무결성 조건을 지키기 위해서 참조하는 테이블의 행도 삭제를 하도록 하는 것이다
이에 맞게 JPA에서는 @OneToMany(cascade = CascadeType.REMOVE)
와 같이 cascade를 시켜준다
Cascade 종류
- ALL: 모두적용
- PERSIST: 영속
- REMOVE: 제거
- MERGE: 병합
- REFRESH: Refresh
- DETACH: Detach
REMOVE는 orphanRemoval = true
조건을 준것과 동일한데 orphanRemoval는 부모 객체가 삭제 되었을때 자식객체도 같이 제거를 하도록 하는 것이다
참고
자바 ORM 표준 JPA 프로그래밍 - 기본편_김영한 님 강의
https://www.inflearn.com/course/ORM-JPA-Basic
책 - 자바 ORM 표준 JPA 프로그래밍
http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788960777330
'공부기록 > JPA' 카테고리의 다른 글
JPA-JPQL (0) | 2022.01.28 |
---|---|
JPA-값타입 (0) | 2022.01.27 |
JPA-고급매핑2 (0) | 2022.01.20 |
JPA 고급매핑1 (0) | 2022.01.20 |
JPA 연관관계 매핑 (0) | 2021.12.29 |