본 문서는 인프런의 자바 ORM 표준 JPA 프로그래밍 - 기본편 (김영한) 강의를 공부하며 작성한 개인 노트입니다.
em.find()
- 디비를 통해 실제 엔티티 객체 조회
em.getReference()
- 디비 조회를 미루는 가짜(프록시) 엔티티 객체 조회
==
는 X.instanceof
사용.System.out.println("m1 == m2" + (m1 instanceof Member));
em.find
) 프록시 객체를 반환한다 em.detach(member)
, em.close()hibernate.LazyInitializationException
예외 발생 > 영속성 컨텍스트가 없다 등프록시 인스턴스의 초기화 여부 확인 - PersistenceUnitUtil.isLoaded(Object entity)
System.out.println("isLoaded = " + emf.getPersistenceUnitUtil().isLoaded(refMember);
프록시 클래스 확인 방법 - entity.getClass().getClass()
출력 > javasist or HibernateProxy
System.out.println("refMember = " + refMember.getClass());
프록시 강제 초기화 - org.hibernate.Hibernate.initialize(entity)
Hibernate.intialize(refMember);
지연로딩(LAZY)으로 프록시 조회
(예) Member 객체를 조회할 때마다 Team까지 조회할 필요는 없음 > team을 LAZY 설정
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn
private Team team;
member.getTeam()
등 경우에 team을 실제로 사용하는 시점에 team 초기화@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "TEAM_ID")
private Team team;
@ManyToOne
, @OneToOne
은 디폴트가 즉시 로딩 > LAZY로 설정@OneToMany
, @ManyToMany
는 디폴트가 지연 로딩자주 함께 사용 > 즉시로딩
가끔 함께 사용 > 지연로딩
CASCADE: 특정 엔티티를 영속 상태로 만들때 연관된 엔티티도 함께 영속상태로 만들고 싶을 때
(예) 부모 엔티티 저장시 자식 엔티티도 함께 저장
@Entity
public class Parent {
...
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
private List<Child> childList = new ArrayList<>();
...
}
고아 객체 제거: 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동삭제
orphanRemoval = true
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Child> childList = new ArrayList<>();
주의사항
@OneToOne
, @OneToMany
만 가능CascadeType.REMOVE
와 동일한 효과em.persist()
, em.remove()
사용CascadeType.ALL
+ orphanRemoval=true
> 부모 엔티티를 통해서 자신의 생명 주기 관리 가능모든 연관관계는 지연 로딩으로