JPA에서 영속성 컨텍스트란 엔티티를 영구 저장하는 환경을 뜻한다.
엔티티 매니저를 통해서 영속성 컨텍스트에 접근한다.
EntityManager.persist(entity);
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
//1차 캐시에 저장됨
em.persist(member);
//1차 캐시에서 조회
Member findMember = em.find(Member.class, "member1");
Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");
System.out.println(a == b); //동일성 비교 true
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
//엔티티 매니저는 데이터 변경시 트랜잭션을 시작해야 한다.
transaction.begin(); // [트랜잭션] 시작
em.persist(memberA);
em.persist(memberB);
//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
//커밋하는 순간 데이터베이스에 INSERT SQL을 보낸다.
transaction.commit(); // [트랜잭션] 커밋
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin(); // [트랜잭션] 시작
// 영속 엔티티 조회
Member memberA = em.find(Member.class, "memberA");
// 영속 엔티티 데이터 수정
memberA.setUsername("hi");
memberA.setAge(10);
//em.update(member)
//이런 코드가 있어야 할 것 같은데 없어도 된다.
//자동으로 변경을 감지하고 업데이트 쿼리를 날려줌.
transaction.commit(); // [트랜잭션] 커밋
영속성 컨텍스트의 변경 내용을 DB에 반영해주는 기능을 한다. 플러시가 발생하면, 변경을 감지하고 변경된 내용들을 자동으로 DB에 쿼리를 날려준다. 영속성 컨텍스트를 플러시하는 방법은 3가지가 있다.
준영속 상태란 영속 상태의 엔티티가 영속성 컨텍스트에서 분리된 상태를 뜻한다.
영속성 컨텍스트가 제공하는 기능을 사용하지 못 한다. 준영속 상태로 만드는 방법은 다음과 같다.
1. em.detach(entity) - 특정 엔티티만 준영속 상태로 전환
2. em.clear() - 영속성 컨텍스트를 완전히 초기화
3. em.close() - 영속성 컨텍스트를 종료
//단순히 객체를 생성만 한 상태(비영속)
Member member = new Member();
member.setId(1L);
member.setName("회원1");
//단순히 객체를 생성만 한 상태(비영속)
Member member = new Member();
member.setId(1L);
member.setName("회원1");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
//객체를 저장한 상태(영속)
em.persist(member);
//회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태
em.detach(member);
//객체를 삭제한 상태(삭제)
em.remove(member);