JPA - 엔티티 매니저와 트랜잭션

2021. 11. 17. 16:17 Java 관련/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]