JPA

[JPA] Spring 없이 간단하게 실습하기

행복하개! 2020. 10. 8. 02:02
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity // 이걸 써야 JPA가 사용하는 애구나 하고 관리해야겠다하고 인식함
//@Table(name = "USER")
public class Member {

    @Id // pk
    private Long id;
    private String name;

//    @Column(name = "user_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;
    }
}

이미 주석에 적어두었지만 @Entity를 써야 JPA가 인식을 한다.(관리할 객체로 지정) @Id를 PK를 주는 어노테이션이다. 그외에도 Table Column등으로 테이블에 메핑할 이름과 컬럼명을 설정할 수 있다.

 

 

 

import javax.persistence.*;
import java.util.List;

/*
    로그에 쿼리가 보이려면
    <property name="hibernate.show_sql" value="true"/>
    <property name="hibernate.format_sql" value="true"/>
    <property name="hibernate.use_sql_comments" value="true"/>
* */
public class JpaMain {

    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); // 데이터베이스당 하나 있어야됨
        EntityManager em = emf.createEntityManager(); // 엔티티 메니저를 통해서 작업

        EntityTransaction tx = em.getTransaction(); // 데이터베이스 모든 변경은 트랜잭션 안에서 일어나야함
        tx.begin();

        // code
        try {
            /* 회원 등록 */
            Member member = new Member();
            member.setId(2L);
            member.setName("HelloB"); // 여기까지 해도 안됨 Transaction안에서 작업해야함

            em.persist(member); // 저장!

            /* 단건 조회 */
            Member findMember = em.find(Member.class, 1L);
            System.out.println("findMember.getId() = " + findMember.getId());
            System.out.println("findMember.getName() = " + findMember.getName());

            /* 수정 */
            findMember.setName("HelloJPA");

            /* 리스트 불러오기 */
            List<Member> result = em.createQuery("select m from Member as m", Member.class)
                    .setFirstResult(5)
                    .setMaxResults(8)
                    .getResultList(); // 멤버 객체를 대상으로 함
            // 대상이 테이블이 아니고 객체임

            for (Member m : result) {
                System.out.println("member.getName() = " + m.getName());
            }

            tx.commit(); // 커밋안하면 반영이 안된다
        } catch (Exception e) {
            tx.rollback(); // 에러시 롤백
        } finally {
            em.close();
        }

        emf.close();
    }

}

엔티티 매니저 팩토리는 하나 생성되서 애플리케이션 전체에서 공유된다. 엔티티 매니저는 쓰레드 간에 공유가 되면 안되고 사용되면 버려야한다. 

그리고 가장 중요한 것 JPA의 모든 데이터 변경은 트랜잭션 안에서 실행되어야 한다.