// 프록시 인스턴스의 초기화 여부 확인
PersistenceUnitUtil.isLoaded(Object entity)
// 프록시 클래스 확인 방법
entity.getClass().getName() 출력(..javasist.. or HibernateProxy...)
// 프록시 강제 초기화
org.hibernate.Hibernate.initialize(entity);
// JPA 표준은 강제 초기화 없음
// 강제 호출: member.getName()
3. 즉시 로딩과 지연 로딩
// 지연 로딩 LAZY을 사용해서 프록시로 조회
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
@ManyToOne(fetch = FetchType.LAZY) //** @JoinColumn(name = "TEAM_ID")
private Team team;
..
}
-실제 엔티티를 사용하는 시점에 초기화(DB 조회)
// Member와 Team을 자주 함께 사용한다면? >> 즉시 로딩 EAGER를 사용해서 함께 조회
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
@ManyToOne(fetch = FetchType.EAGER) //** @JoinColumn(name = "TEAM_ID")
private Team team;
..
}
- 실무에서는 '지연 로딩' 만 사용 !!
- 즉시 로딩을 적용하면 예상하지 못한 sql 문 발생
- 즉시 로딩은 JPQL에서 n+1 문제를 일으킨다.
- @ManyToOne / @OneToOne은 기본이 즉시 로딩이라서 LAZY로 설정해야 됨!!
- @OneToOne / @ManyToMany는 기본이 지연 로딩
지연 로딩 활용
- 두 엔티티(테이블)이 자주 함께 사용 되면 즉시 로딩, 가끔 함께 사용되면 지연 로딩 이용
- 실무에서는 모든 연관관계에 지연 로딩 사용해야 함
- JPQL fetch 조인이나, 엔티티 그래프 기능을 사용
4. 영속성 전이 cascade
- 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속상태로 만들고 싶을 때 (ex: 부모 엔티티 저장할 때 자식 엔티티도 함께 저장)