JPA 구동 방식

현시기얌·2021년 11월 22일
0

JPA

목록 보기
2/14

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의 모든 데이터 변경은 트랜잭션 안에서 실행해야 한다.

profile
현시깁니다

0개의 댓글