애플리케이션 구동과 함께 EntityManagerFactory
가 생성되고 클라이언트의 요청이 들어오면 EntityManager
를 생성해 해당 클라이언트와 DB를 연결해주는 커넥션풀을 생성한다.
EntityManager.persist(entity)
비영속(new/transient)
영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
영속(managed)
영속성 컨텍스트에 관리되는 상태
준영속(detached)
영속성 컨텍스트에 저장되었다가 분리된 상태
삭제(removed)
삭제된 상태
객체를 생성한 후 .persist()
를 통해 영속성을 부여해 EntityManager
가 관리하게 만든다. 영속성이 부여된 Entity
는 .detach()
나 .remove()
를 통해 영속성을 해제할 수 있으며 .flush()
를 통해 영속성이 부여된 Entity
데이터들을 DB에 입력하고 .commit()
을 통해 트랜잭션을 완료할 수 있다.
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
.persist()
나 .find()
등을 통해 EntityManager
에 의해 관리되고 있는 상태Member member = new Member();
member.setId("member1");
member.setUsername(“회원1”);
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
//객체를 저장한 상태(영속)
em.persist(member);
.detach()
나 .clear()
, .close()
에 의해 더 이상 EntityManager
의 관리를 받고 있지 않는 상태EntityManager
의 관리를 받고있지 않는 상태라는건 동일하지만 준영속의 경우에는 영속성을 부여받은 적이 있기 때문에 Id(PrimaryKey)가 존재한다. 비영속의 경우에는 Id(Primarykey)가 존재할수도 있고 아닐수도 있다.EntityManeger
는 Entity를 영속화 할 때 마다 각각 쿼리문을 작성해 DB로 보내지 않는다. DB의 변경이 필요한 Entity변경 사항은 모든 영속화 과정이 끝나고 트랜잭션이 .commit()
될 때 한꺼번에 쿼리문을 작성해 변경사항을 갱신한다.EntityManager
는 관리되고 있는 Entity들의 변경사항을 체크(Dirty Checking)한 후 트랜잭션 .commit()
때 변경된 부분들에 대해서만 Update 쿼리문을 작성해 DB에 보내는 방식을 취한다..commit()
바로 전에 일어남em.setFlushMode(FlushModeType.COMMIT)
FlushModeType.AUTO
커밋이나 쿼리를 실행할 때 플러시(기본값)
FlushModeType.COMMIT
커밋할 때만 플러시
출처 : https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
(자바 ORM 표준 JPA 프로그래밍 - 기본편)