데이터베이스 PK와 매핑
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
<persistence-unit name="hello"> 에서 읽어와 생성EntityManager em = emf.createEntityManager();
고객의 요청이 오면 엔티티매니저팩토리는 엔티티매니저를 생성
-> 엔티티매니저는 내부적으로 DB 커넥션을 사용하여 DB를 사용
EntityTransaction tx = em.getTransaction(); 트랜잭션 얻기
tx.begin(); 트랜잭션 시작
em.persist(); 저장
em.find(); 조회
em.remove(); 삭제
em.set~(); 수정
tx.commit();
tx.rollback();
em.close();
emf.close(); 닫기
테이블이 아닌, entity 객체를 대상으로 쿼리 사용
ex) em.createQuery("select m from Member as m", Member.class)
<property name="hibernate.jdbc.batch_size value="10"/>
모았다가 한번에 쿼리 보내는 개수 설정
비영속 상태
영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
영속 상태
영속성 컨텍스트에 관리되는 상태
1차 캐시에 올라간 상태
em.persist()em.find()준영속 상태
영속성 컨텍스트에 저장되었다가 분리된 상태
영속성 컨텍스트가 제공하는 기능 사용 불가
새로운 객체여도 이미 DB에 저장되었던 기존의 식별자를 갖고 있다면 준영속 엔티티
em.datach() 특정 엔티티만 준영속 상태로 전환
em.clear() 영속성 컨텍스트 초기화
em.close() 영속성 컨텍스트 종료
삭제
삭제된 상태
em.remove
1차 캐시
동일성(identity) 보장
Member a = em.find(Member.class, "member1"); //JPA가 DB에서 가져오면서 1차 캐시에 올려둠 , 쿼리문 o
Member b = em.find(Member.class, "member1"); //1차캐시에서 가져옴 , 쿼리문 x
System.out.println(a == b); //true => 동일성 보장(1차 캐시 때문에 가능) but, 같은 트랜잭션 안에서
트랜잭션을 지원하는 쓰기 지연 (transactional write-behind)
em.persist(memberA);
em.persist(memberB); //아직 쿼리문을 보내지 않음
transaction.commit(); //커밋시 보냄
변경 감지(Dirty Checking)
영속성 컨텍스트의 변경내용을 DB에 동기화
보통 트랜잭션이 커밋되면 자동으로 flush 발생
직접 호출 방법 : em.flush()
자동 호출 방법 :