프록시
- em.find() vs em.getReference()
- em.find(): 데이터베이스를 통해서 실제 엔티티 객체 조회
- em.getReference() : 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회
- 실제 클래스를 상속 받아서 만들어지며 실제 클래스와 겉 모양이 같다
- 프록시 객체는 실제 객체의 참조(target)를 보관
- 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드 호출
[출처] 해당 내용은 김영한 강사님의 인프런 강의를 학습하며 복습을 위해 정리한 글입니다. - https://www.inflearn.com/course/ORM-JPA-Basic
- 프록시 객체는 처음 사용할 때 한 번만 초기화 하며 이 때 프록시 객체가 실제 엔티티로 바뀌는 것이 아니고 초기화 되면 프록시 객체를 통해서 실제 엔티티에 접근하는 방식
- 영속성 컨텍스트에 찾는 엔티티가 이미 있으면 em.getReference()를 호출해도 실제 엔티티 반환
프록시 확인
- 프록시 인스턴스의 초기화 여부 확인 -> PersistenceUnitUtil.isLoaded(Object entity)
- 프록시 강제 초기화 - > org.hibernate.Hibernate.initialize(entity);
프록시와 즉시로딩 주의
- 가급적 지연 로딩만 사용(실무에서 주로 지연로딩위주라고 한다!!)
- 즉시 로딩을 적용하면 예상하지 못한 SQL이 발생할 수 있음
- 즉시 로딩은 JPQL에서 N + 1 문제를 일으킨다
- @ManyToOne, @OneToOne은 기본이 즉시 로딩 -> LAZY로 설정 바꿔야함!
- @OneToMany , @ManyToMany는 기본이 지연로딩
즉시로딩과 지연로딩
- 두 엔티티가 자주 함께 사용 시 - > 즉시로딩
- 두 엔티티가 가끔 사용 시 - > 지연 로딩
영속성 전이 : CASCADE
- 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함꼐 영속상태로 만들고 싶을 때 ex) 부모 엔티티 저장 시 자식 엔티티도 함꼐 저장하고 싶음
- ALL : 모두 적용
- PERSIST : 영속
- REMOVE: 삭제
- MERGE : 병합
고아 객체
- 고아 객체 제거 : 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제
- orphanRemoval = true
- 참조가 제거된 엔티티는 다른 곳에서 참조하지 않는 고아 객체로 보고 삭제하는 기능이다
- 참조하는 곳이 하나일 때 사용해야함
- 특정 엔티티가 개인 소유할 때만 사용
- 고아 객체 제거 기능 활성화 시 부모를 제거할 때 자식도 함꼐 제거된다.