엔티티 매니저 팩토리를 통해서 고객의 요청이 오면 엔티티 매니저를 생성
엔티티 매니저는 내부적으로 데이터베이스 커넥션을 사용하여 디비를 사용
EntityManager.persist(entity);
//객체를 생성한 상태(비영속), JPA와 전혀 관계 없는 상태
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
//객체를 저장한 상태(영속)
em.persist(member);
//회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태
em.detach(member);
//디비에 삭제를 요청한 상태
//객체를 삭제한 상태(삭제)
em.remove(member);
Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");
System.out.println(a == b); //동일성 비교 true
//엔티티 매니저는 데이터 변경시 트랜잭션을 시작해야 한다.
transaction.begin(); // [트랜잭션] 시작
em.persist(memberA);
em.persist(memberB);
//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
//커밋하는 순간 데이터베이스에 INSERT SQL을 보낸다.
transaction.commit(); // [트랜잭션] 커밋
em.persist(memberA)
를 하면 1차 캐시에 저장하고, 엔티티를 분석해서 INSERT SQL을 생성후 쓰기 지연 SQL 저장소에 쌓아둠transaction.commit()
을 하면 쓰기 지연 SQL 저장소에 있던 것들이 flush가 되면서 실제 DB에 commit 됨// 영속 엔티티 조회
Member memberA = em.find(Member.class, "memberA");
// 영속 엔티티 데이터 수정
memberA.setUsername("hi");
memberA.setAge(10);
transaction.commit()
할 때 내부적으로 flush가 호출되고 엔티티와 스냅샷을 비교(1차 캐시 내부에는 @ID(PK), 엔티티, 스냅샷(최초시점의 상태를 넣어둠)이 저장)//삭제 대상 엔티티 조회
Member memberA = em.find(Member.class, “memberA");
em.remove(memberA); //엔티티 삭제
//DELETE 쿼리가 트랜잭션 커밋 시점에 나가게 됨
em.detach(entity)
특정 엔티티만 준영속 상태로 전환 em.clear()
영속성 컨텍스트를 완전히 초기화 em.close()
영속성 컨텍스트를 종료