JPA 구동 방식
JPA 구동 방식
- JPA에는 Persistence라는 클래스가 있는데 이 클래스가 persistence.xml 을 읽고 EntityManagerFactory 클래스를 생성한다.
- 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의 모든 데이터 변경은 트랜잭션 안에서 실행해야 한다.
Author And Source
이 문제에 관하여(JPA 구동 방식), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hyun6ik/JPA-구동-방식저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)