JAVA

[JAVA] JPA 애플리케이션 개발

응디 2021. 11. 2. 17:01

JPA의 구동방식을 아래 이미지로 보고 시작하자!

 

 

1. EntityManagerFactory

  • 데이터베이스당 하나만 생성하여 전체에서 공유하여 사용해야 한다.
  • 여기에 들어가는 name은 persistence.xml의 unit name 이다.

 

2. EntityManager

  • EntityManager는 다른 쓰레드들과 공유하면 안된다.                                                                                                                                       ( Connection과 같다고 보면됨 / conn도 쓰고 close로 버리는것 처럼 얘도 close가 필수다! )
  • 모든 DB 접근은 Manager를 거쳐야한다.

 

3. EntityTransaction

  • DB에 삽입, 수정 등 이용할 때 트랜잭션 받아와서 사용하는게 필수!
  • JPA의 모든 데이터 변경은 트랙잭션 안에서 수행한다. ( 조회-select 는 예외 일 수 있음 )

 

4. JPQL

  • JPQL은 객체 지향 쿼리 이다.
  • 우리가 조건을 가진 쿼리를 써야 할 때는 SQL 작성이 불가피 할 수 있다. 이때 JPA에서 쓰는게 JPQL!
  • JPQL은 엔티티 객체를 중심으로, SQL은 데이터베이스 테이블 중심으로 쿼리를 생성한다. 

 

예시 코드

package hellojpa;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import java.util.List;

public class JpaMain {

    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
            
        EntityManager em = emf.createEntityManager();

        EntityTransaction tx = em.getTransaction();
        tx.begin();

        try{
            /* 삽입 */
            /*Member member = new Member();
            member.setId(2L);
            member.setName("HelloB");
            em.persist(member);*/

            /* 조회 */
            Member findMember = em.find(Member.class, 1L);

            /* 수정 */
            /* 따로 수정 후 저장해 주지 않아도 트랜잭션 커밋하기 전에 
		     * 수정 된 걸 확인 하고 JPA가 알아서 update 쿼리를 날림 */
            findMember.setName("HelloJPA"); 
						
            /* JPQL(객체지향쿼리) - 쿼리를 써야할때가 있다. 그때 사용함
            * JPQL은 엔티티 객체를 중심으로, SQL은 데이터베이스 테이블 중심으로 쿼리를 날린다.
            * */
            List<Member> result = em.createQuery("select m from Member as m ", Member.class)
                    .getResultList();

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


            tx.commit();
        }catch (Exception e){
            //중요!! 문제가 발생하면 rollback
            tx.rollback();
        }finally {
            em.close();
        }
        emf.close();

    }
}

'JAVA' 카테고리의 다른 글

[JAVA] JPA 플러시(flush)  (0) 2021.11.09
[JAVA] JPA 영속성 관리  (0) 2021.11.09
[JAVA] JPA 프로젝트 생성(Maven) + 기본설정  (0) 2021.11.02
[JAVA] JPA란?  (0) 2021.09.09
[JAVA] build  (0) 2021.03.24