JPA와 연관관계, 객체 그래프 탐색 - 연관관계 : member와 연관 관계있는 team - 객체 그래프 탐색 : member를 통해 team에 접근, 즉 참조 가능
신뢰할 수 있는 엔티티, 계층 - 지연 로딩을 통해 자유롭게 객체 그래프 탐색이 가능
class MemberService {
...
public void process() {
Member member = memberDAO.find(memberId);
member.getTeam(); //자유로운 객체 그래프 탐색
member.getOrder().getDelivery();
}
}
동일한 트랜잭션에서 조회한 엔티티는 같음을 보장
성능 최적화 기능
1차 캐시와 동일성(identity) 보장 - 같은 트랜잭션 안에서는 같은 엔티티를 반환 - 약간의 조회 성능 향상
String memberId = "100";
Member m1 = jpa.find(Member.class, memberId); //SQL
Member m2 = jpa.find(Member.class, memberId); //캐시
println(m1 == m2) //true
트랜잭션을 지원하는 쓰기 지연(transactional write-behind) - 트랜잭션을 커밋할 때까지 INSERT SQL을 모아서 한 번에 전송
transaction.begin(); // [트랜잭션] 시작
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
//커밋하는 순간 데이터베이스에 INSERT SQL을 모아서 보낸다.
transaction.commit(); // [트랜잭션] 커밋