3.1 엔티티 매니저 팩토리 & 앤티티 매니저
<persistence-unit name="jpabook">
<properties>
<property name="javax.persistence.jdbc.driver">
value="org.h2.Driver"/>
<property name="javax.persistence.jdbc.user">
value="sa"/>
<property name="javax.persistence.jdbc.password">
value=""/>
<property name="javax.persistence.jdbc.url">
value="jdbc:h2:tcp://localhost/~/test"/>
</persistence-unit>
위의 META-INF/persistence.xml을 바탕으로 EntityManagerFactory를 생성한다.
//공장에서 엔티티 매니저 생성, 비용이 거의 안든다.
EntityManager em = emf.createEntityManager();
EntityManagerFactory는 EntityManager를 만드는 공장인데, EntityManager를 만들때 비용이 거의 발생하지 않는다.
EntityManagerFactory는 여러 스레드가 동시 접근해도 안전하여 서로 다른 스레드 간에 공유해도 되지만,
EntityManager는 여러 스레드가 동시 접근하면 동시성문제가 발생하므로 절대 공유하면 안된다.
3.2 영속성 컨텍스트란?
- EntityManager로 Entity를 저장하거나 조회하면 EntityManager는영속성 컨텍스트에 Entity를 보관하고 관리한다.
em.persist(member);
- persist() 메소드는 EntityManager를 사용하여 회원 Entity를 영속성컨텍스트에 저장한다.
- 영속성 컨텍스트는 EntityManager를 생성할 때 하나 만들어지고, EntityManager를 통해서 영속성 컨텍스트에 접근 할수 있고, 영속성 컨텍스트를 관리 할 수 있다. BUT, 여러 엔티티 매니저가 같은 영속성 컨텍스트에 접근할 수도있다.
3.3 엔티티의 생명주기
Entity에는 4가지 상태가 존재한다.
- 비영속(new/transient) : 영속성 컨텍스트와 전혀 관계가 없는 상태
- 영속(managed) : 영속성 컨텍스트에 저장된 상태
- 준영속(detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태
- 삭제(removed) : 삭제된 상태
1) 비영속
- 엔티티 객체를 생성한 상태
- 순수 객체 상태이며 아직 저장하지 않은 상태
//객체를 생성한 상태(비영속)
Member member = new Member();
member.setId();
member.setUsername("회원1");
2) 영속
- 엔티티 매니저를 통해서 엔티티를 영속성 컨텍스트에 저장한 상태
- 영속성 컨텍스트가 관리하는 엔티티를 영속상태라고 한다.
em.persist(member);
3) 준영속
- 영속성 컨텍스트가 관리하던 영속상태의 엔티티를 영속성 컨텍스트가 관리하지 않으면 준영속 상태가 된다.
- em.clear()를 호출해서 영속성 컨텍스트를 초기화해도 준영속 상태가 된다.
em.detach(member);
4) 삭제
- 엔티티를 데이터베이스에서 삭제한다.
em.remove(member);
3.4 영속성 컨텍스트의 특징
1) 영속성 컨텍스트와 식별자 값
- 영속성 컨텍스트는 엔티티를 식별자 값(@Id로 테이블의 기본키와 매핑한 값)으로 구분한다.
- 영속 상태는 식별자 값이 반드시 있어야 한다.
2) 영속성 컨텍스트와 데이터베이스 저장
- JPA는 보통 트랜젝션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 데이터베이스에 반영하는데 이를 플러시(flush)라고 한다.
3) 영속성 컨텍스트가 엔티티를 관리하면, 다음과 같은 장점이 있다.
- 1차캐시
- 동일성 보장
- 트랜젝션을 지원하는 쓰기 지연
- 변경감지
- 지연로딩
'JPA' 카테고리의 다른 글
3.7 정리 (0) | 2021.01.09 |
---|---|
3.6 준영속 (0) | 2021.01.09 |
3.5 플러시 (0) | 2021.01.09 |
3.4 영속성 컨텍스트의 특징 (0) | 2021.01.09 |
1.3 JPA란 무엇인가? (0) | 2021.01.04 |