JPA의 영속성 컨텍스트는 중요한 개념이기때문에 이해를 무조건 해야한다.
// 객체 생성 = 비영속
Member member = new Member();
member.setId("member1");
member.setName("회원1")
// 객체 생성 = 비영속
Member member = new Member();
member.setId("member1");
member.setName("회원1")
// emf는 EntityManagerFactory
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
// 객체를 저장한 상테 = 영속
em.persist(member);
// member 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태
// 특정 엔티티만 준영속 상태로 전환
em.detach(member);
// 영속성 컨텍스트를 완전히 초기화
em.clear();
//영속성 컨텍스트를 종료
em.close();
// member 엔티티를 삭제한 상태
em.remove(member)
그러면 이렇게 영속성 컨텍스트를 중간에 둠으로써 얻는 이점은 무엇이 있을까?
// 객체 생성 = 비영속
Member member = new Member();
member.setId("member1");
member.setName("member")
em.persist(member)
// 객체 생성 = 비영속
Member member = new Member();
member.setId("member1");
member.setName("member")
em.persist(member)
// member1 조회
Member findMem = em.find(Member.class, "member1");
// member2 조회
Member findMem = em.find(Member.class, "member2");
Member findMem1 = em.find(Member.class, "member1");
Member findMem2 = em.find(Member.class, "member1");
// 결과
findMem1 == findMem2 결과 : true
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
em.persist(MemberA);
em.persist(MemberB);
// persist()는 sql문을 DB에 날리지 않는다.
// commit()하는 순간 DB에 쿼리문을 날린다.
tx.commit();
// 영속 엔티티 조회
Member member = em.find(Member.class, 1L);
// 영속 엔티티 데이터 수정
member.setName("Spring");
...
transaction.commit();
// 직접 호출
em.flush()
// commit() 시점에 자동으로 flush 호출
transaction.commit()
// flush() 자동 호출
JPQL 쿼리 실행
// 커밋이나 쿼리를 실행할 때 플러시 (defalut값)
em.setFlushMode(FlushModeType.AUTO);
// 커밋할 때만 플러시
em.setFlushMode(FlushModeType.COMMIT);
자바 ORM 표준 JPA 프로그래밍-기본편을 학습하면서 정리한 블로그입니다.