Closed BETTERFUTURE4 closed 2 years ago
em.find()
em.getReference()
class a { public static void main(String[] args) { Member member = em.getReference(Member.class, "id1"); member.getName(); } }
getName()
DB
==
instance of
detach
LazyInitializationException
PersistenceUnitUtil.isLoaded(Object entity)
entity.getClass().getName()
HibernateProxy
Hibernate.initialize(entity)
@ManyToOne(fetch = FetchType.Lazy)
@ManyToOne(fetch = FetchType.EAGER)
JPQL
N+1
@ManyToOne
@OneToOne
LAZY
fetch Join
@OneToMany(mappedBy="parent", cascade=CascadeType.XXX)
persist()
CASCADE
ALL
PERSIST
REMOVE
orphanRemoval = true
@OneToMany
CascadeType.ALL + orphanRemovel=true
em.persist()
em.remove()
DDD
Aggregate Root
섹션 8 : 프록시와 연관관계 정리
8-1 프록시
em.find()
em.getReference()
1) 프록시 초기화
getName()
호출DB
조회2) 프록시 특징
==
대신instance of
을 사용해라em.getReference()
) 실제 엔티티를 반환detach
)일 시LazyInitializationException
예외 발생!3) 프록시 확인
PersistenceUnitUtil.isLoaded(Object entity)
entity.getClass().getName()
을 프린트!HibernateProxy
.. 형태로 출력됨Hibernate.initialize(entity)
8-2 즉시로딩/지연로딩
1) 지연로딩(LAZY)
@ManyToOne(fetch = FetchType.Lazy)
2) 즉시로딩(EAGER)
@ManyToOne(fetch = FetchType.EAGER)
3) 실무에서는 지연로딩을 쓰자!
JPQL
에서N+1
문제를 발생시킨다!@ManyToOne
,@OneToOne
는 기본이 즉시 로딩LAZY
로 재설정 해야 함!4)
N+1
문제해결법
fetch Join
사용 : 동적으로 원하는 엔티티들을 가져옴(나중에 설명)8-3 영속성 전이 : CASCADE
@OneToMany(mappedBy="parent", cascade=CascadeType.XXX)
persist()
)할 때 자식 엔티티도 함께 저장1)
CASCADE
의 종류ALL
: 모두 연쇄 적용PERSIST
: 영속(저장만 연쇄로)REMOVE
: 삭제2) 언제쓰나
8-4 고아 객체
orphanRemoval = true
옵션 사용CASCADE
의REMOVE
와 비슷한 방식1) 주의사항
@OneToOne
,@OneToMany
만 가능!7-5 영속성 전이 + 고아객체, 생명주기
CascadeType.ALL + orphanRemovel=true
em.persist()
로 영속화em.remove()
로 제거DDD
)의Aggregate Root
개념을 구현할 때 유용