
J2SE : Entity Manager -> Persistence Context , 1:1 환경
Spring, J2EE : Entity Manager -> Persistence Context , N:1 환경

비영속 : 객체 생성만

영속 : EntityManager 의 객체가 em 이라면 em.persist(Object)

준영속 : em.detach(Object) , 영속성 컨텍스트에서 분리
삭제 : em.remove(Object) , 객체 삭제
Commit, Flush 전 1차 캐시에 영속된 데이터를 저장, 조회 시에도 1차캐시에서 먼저 Find() 를 실행함, 없는 객체를 조회하면 그 데이터(객체) 도
1차 캐시에 저장함
Persistence Context 내부에 존재하는 Object 가 같은 데이터라면 동일 Transaction 에선 동일성을 보장함 (Equal 비교 가능)
1차 캐싱으로 인해 반복 가능 읽기 (Repeated Read) 등급의 Transaction Isolation Level 을 Application 차원에서 지원함.
Entity Manager 는 데이터 변경 시에 Transaction 을 실행하야함. 이후 비즈니스 로직을 수행하고 오류없이 진행된다면 커밋함
커밋 시에 Database 에 SQL 을 보냄 (쓰기 지연 SQL 저장소에 SQL 문을 저장해놓음)
영속성 컨텍스트가 Commit 되면 Flush 하여 DB 에 한꺼번에 저장함
Snapshot 을 활용하여 Transaction 시작 지점의 DB 상태를 임시로 저장해두었다가 변경사항이 있을 시 스냅샷 데이터와 비교해 update SQL 문을 작성하고 이를 Flush 하여 DB 에 반영함.
엔티티 삭제도 마찬가지로 지연 SQL 저장소에 저장해두었다가 저장 후 지연로딩 함
영속성 컨텍스트의 변경 내용을 DB 에 반영함
지연 SQL 저장소에 알맞은 SQL 문을 작성하여 등록함 -> 이를 DB 에 전송함em.flush()JQPL 실행 시에 Flush가 발생하는 이유?
JQPL 실행 시에 데이터가 최신 데이터로 갱신되어있지 않으면 데이터 무결성에 에러가 생김
플러시 모드 옵션 : em.setFlushmode(FlushmodeType.COMMIT)
FlushmodeType.AUTO : 커밋, 쿼리 실행 시에 플러시 (기본 값)FlushmodeType.COMMIT : 커밋 할 때만 플러시Transaction 작업 단위가 중요함 (COMMIT 직전에 Flush 로 데이터를 동기화 시킴)준영속 상태는 Flush 에 영향을 받지 않음, 영속 상태의 엔티티가 Detach 되는 것이기 때문에 영속성 컨텍스트가 제공하는 1차 캐싱, 지연 sql 저장소 등등의 기능을 사용하지 못함
준영속 상태로 만듦Persistence Context 를 초기화Persistence Context 를 종료시킴