책 [자바 ORM 표준 JPA 프로그래밍]을 참고하여 작성하였습니다.

비영속(new/trasient) : 영속성 컨텍스트와 관계 없는 상태
영속(managed) : 영속성 컨텍스트에 저장된 상태
준영속(detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태
삭제(removed) : 삭제된 상태
em.persist()를 호출하면 영속 상태가 된다.em.find()나 JPQL을 사용해서 조회한 엔티티도 영속 상태em.detach()를 호출하면 준영속 상태가 된다.em.close()를 호출해 영속성 컨텍스트를 닫거나 em.clear()를 호출해서 영속성 컨텍스트를 초기화해도 준영속 상태가 된다.em.find()를 호출하면 엔티티 매니저는 먼저 1차 캐시에서 엔티티를 찾고, 없으면 db를 조회해서 엔티티를 생성하고 1차캐시에 저장해서 영속 상태의 엔티티를 반환한다.동일성(identity) : 인스턴스가 같음
동등성(equality) : 인스턴스는 달라도 인스턴스가 가지는 값이 같음
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin(); //트랜잭션 시작
em.persist(memberA);
em.persist(memberB);
transaction.commit(); //커밋하는 순간 db에 insert 쿼리를 보낸다.(트랜잭션 커밋)
스냅샷 : JPA에서 엔티티를 영속성 컨텍스트에 보관할 때, 최초 상태를 복사해서 저장해두는 것
flush할 때 스냅샷과 엔티티를 비교하여 변경된 엔티티를 찾아, 엔티티의 변경사항을 db에 자동으로 반경하는 기능을 변경 감지(dirty checking)라고 한다.
변경 감지는 영속성 컨텍스트가 관리하는 영속 상태의 엔티티에만 적용된다.
변경 감지 과정
MemberA memberA = em.find(Member.class,"memberA");
em.remove(memberA); //호출하는 순간 memberA는 영속성 컨테스트에서 제거됨
flush를 호출해서 실제 db에 delte 쿼리 전달플러시는 영속성 컨텍스트의 변경 내용을 db에 반영한다.
영속성 컨텍스트를 플러시하는 방법
1. em.flush()를 직접 호출
2. 트랜잭션 커밋 시 플러시 자동 호출
3. JPQL 쿼리 실행 시 플러시가 자동 호출
em.setFlushModeType.AUTO //커밋이나 쿼리를 실행할 때 플러시(default)
em.setFlushModeType.COMMIT //커밋할 때만 플러시
영속성 컨텍스트가 관리하는 영속 상태의 엔티티가 영속성 컨텍스트에서 분리된 상태
영속 상태의 엔티티를 준영속 상태로 만드는 방법
1. 엔티티를 준영속 상태로 전환
2. 영속성 컨텍스트를 초기화
3. 영속성 컨텍스트를 종료
em.detach()는 특정 엔티티를 준영속 상태로 만든다.em.persist()를 영속화한 엔티티에 대해서 em.detach()를 호출하면 준영속 상태로 만들드 수 있다.1차 캐시, 쓰기 지연, 변경 감지, 지연 로딩 같은 영속성 컨텍스트가 제공하는 어떠한 기능도 작동x
영속 상태에서 준영속 상태가 된 것이기 때문에 식별자 값을 갖고 있을 수 밖에 없음
지연 로딩(LAZY LOADING) : 실제 객체 대신 프록시 객체를 로딩해두고 해당 객체를 실제 사용할 때 영속성 컨텍스트에서 데이터를 로딩.
준영속 상태의 엔티티를 다시 영속 상태로 만들 때는 merge()를 사용