게시물은 인프런 김영한님의 JPA 강의를 듣고 정리해보았습니다.
영속성 컨텍스트를 사용함으로써 얻는 이점 5가지가 있다.
//엔티티를 생성한 상태(비영속)
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
//엔티티를 영속
em.persist(member)
//1차 캐시에서 조회
Member findMember = em.find(Member.class, "member1");
//1차 캐시에 없는것을 조회
Member findMember2 = em.find(Member.class, "member2");
Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");
System.out.println(a == b); //동일성 비교 true
em.persist(memberA);
em.persist(memberB);//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
//커밋하는 순간 데이터베이스에 INSERT SQL을 보낸다.
transaction.commit(); // 트랜잭션 커밋
persist()
persist(memberA)
persist(memberB)
commit()
transaction.commit()
쓰기지연을 하는 이유
- 여러 쿼리를 하나의 트랜잭션으로 묶을 수 있다.
- DB에 한번에 보낼수있어 네트워크 트래픽을 감소해 성능을 향상 시킬 수 있다.
- 버퍼링과 관련된 기능으로 jdbc의 batch 부분을 참고하면 될 것.
// 영속 엔티티 조회
Member memberA = em.find(Member.class, "memberA");// 영속 엔티티 데이터 수정
memberA.setUsername("hi");
memberA.setAge(10);
//em.update(member) 이런 코드가 있어야 하지 않을까?
transaction.commit(); // 트랜잭션 커밋
//삭제 대상 엔티티 조회
Member memberA = em.find(Member.class, “memberA");
em.remove(memberA); //엔티티 삭제
: 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영
flush를 해도 1차 캐시는 비워지지않는다. 1차캐시와 flush는 관계 없음.