Spring/JPA

JPA 애플리케이션 개발

Ynghan 2023. 2. 18. 18:09

 

JPA가 어떻게 동작하는데?

JPA는 Persistence라는 클래스가 있는데 여기서 persistence.xml 설정 정보를 읽어서 EntityManagerFactory를 만듬. 여기서 필요할 때마다 EntityManager를 찍어냄.
  1. JpaMain 클래스를 만듬
  2. JPA가 어떻게 동작하는지 살펴봄.

* h2에 처음 db를 만드는 경우 H2 (Server) _ jdbcLh2L~/db명 _ 연결

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

 

Member.java
@Entity
public class Member {
    @Id
    private Long id;
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}


회원 등록

JpaMain.java
public class JpaMain {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("practice");
        EntityManager em = emf.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        try {
            Member member1 = new Member();
            Member member2 = new Member();
            member1.setId(1L);
            member2.setId(2L);

            member1.setName("helloA");
            member2.setName("helloB");

            em.persist(member1);
            em.persist(member2);
            Member findMember = em.find(Member.class, 1L);
            System.out.println("findMember id = " + findMember.getId());

            tx.commit();
        } catch (Exception e){
            tx.rollback();
        } finally {
            em.close();
        }
        emf.close();
    }
}

회원 수정

public class JpaMain {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("practice");
        EntityManager em = emf.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        try {
            Member findMember = em.find(Member.class, 1L);
            findMember.setName("HelloJPA");
            tx.commit();
        } catch (Exception e){
            tx.rollback();
        } finally {
            em.close();
        }
        emf.close();
    }
}

주의!

엔티티 매니저는 쓰레드 간에 공유하면 안됨.

JPA의 모든 데이터 변경트랜잭션 안에서 실행.