JPA 구동 방식

JPA 구동 방식

  1. JPA에는 Persistence라는 클래스가 있는데 이 클래스가 persistence.xml 을 읽고 EntityManagerFactory 클래스를 생성한다.
  2. EntityManagerFactory가 EntityManager를 생성한다.
public static void main(String[] args) {
        final EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

        final EntityManager em = emf.createEntityManager();

        em.close();
        emf.close();
 }

객체와 테이블 생성하고 매핑하기

@Entity : JPA가 관리할 객체
@Id : 데이터베이스 PK와 매핑

@Entity
@Getter
@NoArgsConstructor
public class Member {

    @Id
    private Long id;
    private String name;

    public Member(Long id, String name) {
        this.id = id;
        this.name = name;
    }
    
    public static Member of(Long id, String name) {
      	return new Member(id, name);
    }
    
    public void changeName(String name) {
        this.name = name;
    }
    
}
 public static void main(String[] args) {
        final EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

        final EntityManager em = emf.createEntityManager();

        final EntityTransaction tx = em.getTransaction();
        tx.begin();
        
	try {
            final Member member = Member.of(1L, "HelloA");
            em.persist(member);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        }   finally {
            em.close();
        }
        
        emf.close();
    }

JPA는 트랜잭션 안에서만 작업해야 한다.

 public static void main(String[] args) {
        final EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

        final EntityManager em = emf.createEntityManager();

        final EntityTransaction tx = em.getTransaction();
        tx.begin();

        try {
            final Member findMember = em.find(Member.class, 1L);
            findMember.changeName("HelloJPA");
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        }   finally {
            em.close();
        }

        emf.close();
    }

위의 코드를 실행하면 이름 값만 바꿨을 뿐인데 DB에 따로 업데이트하는 과정없이 자동으로 update 쿼리가 나가는걸 알 수 있다.
이는 JPA에서 변경감지가 일어났기 때문이다.

cf)

EntityManagerFactory는 하나만 생성해서 애플리케이션 전체에서 공유한다. (싱글톤)
EntityManager는 쓰레드간에 공유하지 않는다. (사용하고 버려야 한다.)
JPA의 모든 데이터 변경은 트랜잭션 안에서 실행해야 한다.

좋은 웹페이지 즐겨찾기