public static void main(String[] args){ //엔티티 매니저 팩토리 - 생성 EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook"); //엔티티 매니저 - 생성 EntityManager em = emf.createEntityManager(); //트랜잭션 - 획득 EntityTransaction tx = em.getTransaction(); try { tx.begin(); logic(em); //비즈니스 로직 실행 tx.commit(); } catch (Exception e) { tx.rollback(); } finally { em.close(); //엔티티 매니저 - 종료 } emf.close(); //엔티티 매니저 팩토리 - 종료}

JPA를 시작하려면 먼저 persistence.xml의 설정 정보를 사용해서 엔티티 매니저 팩토리를 생성해야 한다.
이때 Persistence 클래스를 사용해 엔티티 매니저 팩토리를 생성해서 JPA를 사용해 사용할 수 있게 준비한다.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook")
persistence.xml에서 이름이 “jpabook”인 영속성 유닛을 찾아서 엔티티 매니저 팩토리를 생성한다. 이때 persistence.xml의 설정 정보를 읽어서 JPA를 동작시키키 위한 기반객체를 만들고 JPA 구현체에 따라 데이터베이스 커넥션풀도 생성하므로 엔티티 매니저 팩토리를 생성하는 비용은 아주 크다.
엔티티 매니저 팩토리는 애플리케이션 전체에서 딱 한 번만 생성하고 공유해서 사용해야 한다.
엔티티 매니저 생성
EntityManager em = emf.createEntityManager()
엔티티 매니저 팩토리에서 엔티티 매니저를 생성한다. (JPA의 기능 대부분을 제공)
대표적으로 엔티티를 데이터베이스에 등록/수정/삭제/조회할 수 있다.
엔티티 매니저는 내부에 데이터소스(데이터베이스 커넥션)를 유지하면서 데이터베이스와 통신한다. (엔티티 매니저를 가상의 데이터베이스로 생각할 수 있다.)
엔티티 매니저는 데이터베이스 커넥션과 밀접한 관계가 있으므로 스레드간에 공유하거나 재사용하면 안 된다.
종료
사용이 끝난 엔티티 매니저는 반드시 종료해야 한다. em.close()
애플리케이션을 종료할 때 엔티티 매니저 팩토리도 종료해야 한다. emf.close()
JPA를 사용하면 항상 트랜잭션 안에서 데이터를 변경해야 한다. 트랜잭션 없이 데이터 변경 시 예외 발생.
트랜잭션을 시작하려면 엔티티 매니저에서 트랜잭션 API를 받아와야 한다.
EntityTransaction tx = em.getTransaction(); //트랜잭션 APItry{ tx.begin(); logic(em); //비즈니스 로직 실행 tx.commit();}catch (Exception e){ tx.rollback(); //예외 발생 시 트랜잭션 록백}
비즈니스 로직이 정상 동작하면 트랜잭션을 커밋하고 예외가 발생하면 트랜잭션을 롤백한다.