JPA-프록시
프록시
실제 클래스를 상속받아서 만들어진 가짜 객체
객체를 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 프로그래밍 - 기본편 - 인프런 | 강의
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런
www.inflearn.com
책 - 자바 ORM 표준 JPA 프로그래밍
http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788960777330
자바 ORM 표준 JPA 프로그래밍 - 교보문고
스프링 데이터 예제 프로젝트로 배우는 전자정부 표준 데이터베이스 프레임 | ★ 이 책에서 다루는 내용 ★■ JPA 기초 이론과 핵심 원리■ JPA로 도메인 모델을 설계하는 과정을 예제 중심으로
www.kyobobook.co.kr