JPA는 특정 데이터베이스에 종속되지 않음
→ 각 요청마다 EntityManagerFactory가 EntityManager를 생성하여 처리함
→ "엔티티를 영구 저장하는 환경"이라는 뜻
→ 논리적인 개념으로 눈에 보이지는 않음
→ EntityManager를 통해서 영속성 컨테스트에 접근함
EntityManager.persist(entity);
→ 비영속 (new/transient) : 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
→ 영속 (managed) : 영속성 컨테스트에 관리되는 상태
→ 준영속 (detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태
→ 삭제 (removed) : 삭제된 상태
// 객체를 생성한 상태 (비영속)
Member member = new Member();
member.setId("test1");
member.setUsername("회원1");
// 객체를 생성한 상태 (비영속)
Member member = new Member();
member.setId("test1");
member.setUsername("회원1");
EntityManager em = entityManagerFactory.createEntityManager();
em.getTransaciton().begin();
// 객체를 저장한 상태 (영속)
em.persist(member);
// 회원 객체를 영속성 컨텍스트에서 분리 (준영속 상태)
entityManager.persist(member);
// 회원 객체를 삭제한 상태 (삭제)
entityManager.remove(member);
// 객체를 생성한 상태 (비영속)
Member member = new Member();
member.setId("test1");
member.setUsername("회원1");
EntityManager em = entityManagerFactory.createEntityManager();
em.getTransaciton().begin();
// 객체 영속
em.persist(member);
// 객체를 생성한 상태 (비영속)
Member member = new Member();
member.setId("test1");
member.setUsername("회원1");
// 객체 영속 = 1차 캐시에 저장됨
em.persist(member);
// 1차 캐시에서 조회 가능
Member findMember = em.find(Member.class, "test1");
Member findMember2 = em.find(Member.class, "test2");
Member a = em.find(Member.class, "test1);
Member b = em.find(Member.class, "test2);
System.out.println(a == b); // 동일성 비교 true 반환
EntityManager em = entityManagerFactory.createEntityManager();
EntityTransaction transaction = em.getTransaction();
// EntityManager는 데이터 변경 시 트랜잭션을 시작해야 함
transaction.begin(); // [트랜잭션] 시작
em.persist(memberA);
em.persist(memberB);
// 아직 Insert SQL을 데이터베이스에 보내지 않음
// 커밋하는 순간 데이터베이스에 Insert SQL을 보냄
transaction.commit(); // [트랜재션] 커밋
추가) batch_size 설정
<property name="hibernate.jdbc.batch_size" value="10"/>
SQL을 모아두었다가(설정한 batch_size만큼) DB에 한방에 날림, Buffering 기능
EntityManager em = entityManagerFactory.createEntityManager();
EntityTransaction transaction = em.getTransaction();
// EntityManager는 데이터 변경 시 트랜잭션을 시작해야 함
transaction.begin(); // [트랜잭션] 시작
// 영속 엔티티 조회
Member memberA = em.find(Member.class, "test1");
// 영속 엔티티 데이터 수정
memberA.setUsername("me"); // 해당 코드만으로도 Update 쿼리가 생성되어 DB에 전달할 수 있음
em.update(memberA); // 이러한 호출이 필요없음 ! ! !
transaction.commit(); // [트랜잭션] 커밋
→ memberA.setUsername("me"); 해당 코드에서 Update 쿼리가 생성되어 DB에 전달할 수 있음
→ em.update(memberA); 이러한 추가적인 호출이 필요없음
// 삭제 대상 엔티티 조회
Member memberA = em.find(Member.class, "test1");
// 엔티티 삭제
em.remove(memberA);
→ flush를 해도 1차 캐시는 유지됨 (= 영속성 컨텍스트를 비우지 않음)
→ 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화
→ '트랜잭션' 이라는 작업 단위가 중요! 커밋 직전에만 동기화 하면 됨
→ 영속 -> 준영속 상태로 변경 가능함
→ 영속 상태의 엔티티가 영속성 컨텍스트에서 분리됨(detached)
→ 영속성 컨텍스트가 제공하는 기능을 사용 모함