JPA - 엔티티 매니저와 트랜잭션
엔티티 매니저
JPA의 기능 대부분을 EntityManager가 제공하고 있습니다. 엔티티 매니저를 통해 데이터베이스의 기본 동작인 CRUD(Create, Read, Update, Delete)를 제공합니다. 엔티티 매니저는 다음과 같은 형태로 선언해 사용합니다.
// Use persistence.xml configuration
EntityManagerFactory emf = Persistence.createEntityManagerFactory("manager1")
EntityManager em = emf.createEntityManager(); // Retrieve an application managed entity manager
// Work with the EM
em.close();
...
emf.close(); //close at application end
애플리케이션을 초기화하고 종료하는 것은 처리할 내용이 많습니다. 엔티티 매니저는 데이터베이스 연결을 유지할 수 있게 합니다. 엔티티 매니저 팩토리는 META-INF/persistence.xml에 설정된 정보를 바탕으로 엔티티 매니저 팩토리를 생성합니다. 내부적으로는 ClassLoader.getResource("META-INF/persistence.xml") 메서드를 이용해 xml 설정을 읽어 들여 처리합니다. 엔티티 매니저 팩토리는 애플리케이션 전체에서 공유할 수 있는 객체입니다. 앤티티 매니저는 엔티티 매니저 팩토리 에 의해 생성되는 객체로 생성에 필요한 비용이 크지 않습니다. 그렇더라도 엔티티 매니저는 하나의 작업이 끌나면 다음과 같이 반드시 닫아야합니다.
em.close()
그리고 엔티티 매니저 팩토리 객체도 애플리케이션이 끝나기 전에 반드시 닫도록 해야 합니다.
emf.close()
엔티티 생명주기
엔티티 생명주기는 4가지 상태로 구분할 수 있습니다.
- new 생성 : 엔티티 인스턴스가 초기화된 상태
- managed 관리 : 엔티티 인스턴스가 영속성 컨택스트에 저장된 상태
- detached 분리 : 엔티티 인스턴스가 영속성 컨택스트에서 분리된 상태
- removed 제거 : 엔티티 인스턴스가 영속성 컨택스트에서 제거된 상태
트랜잭션
JPA에서 트랜잭션은 다음과 같은 형태로 관리됩니다.
Transaction tx = em.getTransaction().begin();
...
em.getTransaction().commit();
엔티티 매니저에서 트랜잭션을 실행하도록 begin() 메서드를 시작하도록 합니다. 그리고 실재 데이터베이스에 변경 사항을 반영할 때 커밋(commit)을 날리는데 커밋을 날릴 때 정상적으로 데이터베이스에 변경 사항이 반영 되면 커넥션을 종료(disconnect)합니다.
em = emf.createEntityManager();
Transaction tx = em.getTransaction().begin();
em.setFlushMode(FlushModeType.COMMIT); // allow queries to return stale state
Cat izi = em.find(Cat.class, id);
izi.setName(iznizi);
// might return stale data
em.createQuery("from Cat as cat left outer join cat.kittens kitten").getResultList();
// change to izi is not flushed!
...
em.getTransaction().commit(); // flush occurs
참고
출처: https://happygrammer.tistory.com/147?category=891896 [happygrammer]
'Java 관련 > JPA' 카테고리의 다른 글
JPA - 스프링 데이터 JPA (0) | 2021.11.17 |
---|---|
JPA - 하이버네이트와 스프링 연동 (0) | 2021.11.17 |
JPA - JPQL과 Criteria 쿼리 (0) | 2021.11.17 |
JPA - 엔티티 매핑 (0) | 2021.11.17 |
JPA에 기반한 비즈니스로직 중심의 S/W 개발 (0) | 2021.11.17 |
JPA 요소 (0) | 2021.10.05 |
[JPA] Entity 객체 생명주기(Lifecycle)와 Persistence Context (0) | 2020.09.07 |
[JPA] @ManyToMany, N:M 관계 매핑 (0) | 2020.09.07 |