- 비영속(new/transient) - 영속성 컨텍스트와 전혀 무관한 상태
- 영속(managed) - 영속성 컨텍스트에 저장된 상태
- 준영속(detached) - 영속성 컨텍스트에 한 번 저장되었다가 분리된 상태
- 삭제(removed) - 삭제된 상태
em.persist()
메소드 사용, em.find()
를 통해서도 영속 상태로 만들 수 있음em.merge()
로 준영속 -> 영속 상태로 전환 가능em.detach(entity)
- 준영속 상태 명시적 호출, 특정 엔티티를 영속성 컨텍스트에서 분리em.cloase()
- 영속성 컨텍스트를 닫음, 영속석 컨텍스트가 관리하던 모든 엔티티들을 준영속 상태로 전환em.clear()
- 영속성 컨텍스트 초기화, 영속석 컨텍스트가 관리하던 모든 엔티티들을 준영속 상태로 전환em.remove(..)
1) persiste(memberA)
- 영속 컨텍스트 1차에 엔티티 등록
2) 엔티티에 설정된 값을 기반으로 INSERT SQL 명령어 실행
3) 쓰기 지연 SQL 저장소에 등록
Member member = em.find(Member.class, 100L);
em.find() 호출
1차 캐시에서 식별자 값으로 엔티티를 찾음
Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");
System.out.println(a == b); // 동일성 비교
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
// 엔티티 매니저는 데이터 변경 시 트랜잭션을 시작해야 한다.
transaction.begin(); // 트랜잭션 시작
em.persist(memberA);
em.persist(memberB);
// 여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
// 커밋하는 순간 데이터베이스에 INSERT SQL을 보낸다.
transaction.commit(); // 트랜잭션 커밋
1) 트랜잭션 커밋 -> 엔티티 매니저 내부에서 먼저 플러시 호출
2) 엔티티와 스냅샷을 비교해서 변경된 엔티티 찾기
3) 변경된 엔티티가 있으면 수정 쿼리를 생성해서 쓰기 지연 SQL 저장소로
4) 쓰기 지연 저장소의 SQL을 데이터베이스로 보냄
5) 데이터베이스 트랜잭션을 커밋
Member memberA = em.find(Member.class, 100L); // 삭제 대상 엔티티 조회
em.remove(memberA); // 엔티티 삭제
em.remove(memberA);
호출 시 영속성 컨텍스트에서 제거1) 변경 감지 동작, 모든 엔티티를 스냅샷과 비교
2) 수정된 엔티티는 수정쿼리 생성 후 쓰기 지연 SQL 저장소 등록
3) 쓰기 지연 SQL 저장소의 쿼리를 DB로 전송
1) em.flush() 직접 호출
2) 트랜잭션 커밋 시 플러시 자동 호출
3) JPQL 쿼리 실행 시 플러시 자동 호출
https://ultrakain.gitbooks.io/jpa/content/chapter3/chapter3.html