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