본문 바로가기

Java

JPA 구현체 하이버네이트 사용방법

 

프로젝트 환경 및 라이브러리 세팅

 

 - 자바 8 이상(권장)

 - H2 데이터베이스

 - Maven

- 하이버네이트 (JPA 구현체)

 

 

라이브러리 추가 - pom.xml

    <dependencies>
        <!-- JPA 하이버네이트 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.6.15.Final</version>
        </dependency>

        <!-- H2 데이터베이스 -->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>2.2.222</version>
        </dependency>
    </dependencies>

 


 

JPA 설정하기

 

 resources 폴더 하위에

 /META-INF/persistence.xml 생성

 

 

 

 

persistence.xml 

 

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
             xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">

    <persistence-unit name="hello">  // 이부분은 나중에 EntityManageFactory 만들때 사용
        <properties>
            <!-- 필수 속성 -->
            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
            <property name="javax.persistence.jdbc.user" value="sa"/>
            <property name="javax.persistence.jdbc.password" value=""/>
            <property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> <!-- 데이터베이스 방언 -->

            <!-- 옵션 -->
            <property name="hibernate.show_sql" value="true"/>   <!-- 쿼리 출력 여부 -->
            <property name="hibernate.format_sql" value="true"/>   <!-- 쿼리 출력 포맷-->
            <property name="hibernate.use_sql_comments" value="true"/>  <!-- 쿼리가 나온 이유 설명 -->
            <property name="hibernate.jdbc.batch_size" value="10"/>     <!-- jdbc batch 사이즈 설정 -->
            <property name="hibernate.hbm2ddl.auto" value="create" />   <!-- ddl option --> 
        </properties>
    </persistence-unit>
</persistence>

 

 

데이터베이스 방언

 

JPA 는 특정 데이터베이스에 종속 되어 있지 않습니다.

 

따라서 각각의 데이터베이스가 제공하는 SQL 문법에 따라 SQL을 매핑합니다.

 

 ex) 가변문자의 경우 MySQL 은 VARCHAR 를 사용하고 Oracle 의 경우 VARCHAR2 를 사용합니다.

       이를 방언 설정을 통해 어떤 데이터베이스를 사용하고 있는지 알려주어야합니다.

 

    

하이버네이트는 40가지 이상의 데이터베이스 방언을 지원하기 떄문에 사용하시는 데이터베이스를 선택하시면 됩니다.

 

 

필수 속성에서 javax 와 hibernate 를 보실수 있는데,

먼저 저희가 사용하는 JPA의 구현체의 경우 hibernate 입니다.

 

 

따라서 javax 부분은 JPA의 다른 구현체를 사용할때 변경가능하지만

hibernate 부분은 hibernate 구현체를 사용하실때만 사용할 수 있습니다.

따라서 방언 설정은 hibernate의 기능중 하나입니다.

 


JPA 구동 방식

 

1. 설정 정보 조회 - persistence.xml

 

2. Persistence 로 부터 EntityManagerFactory  생성

 

3. EntityManagerFactory 로부터 EntityManager 생성

 

public class Main {
    public static void main(String[] args) {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        // hello 설정파일 설정정보, Persistence.xml 에서 <persistence-unit name="hello"> 이부분

        EntityManager em = emf.createEntityManager();
        // db 작업은 EntityManager 로함

        EntityTransaction tx = em.getTransaction();
        // 모든 변경은 트랜잭션 안에서만 해야한다.

        tx.begin();

        try {

			// 이부분 에서 JPA CRUD 작업
			

            tx.commit();
        } catch(Exception e) {
            tx.rollback();
        } finally {
            em.close();  // EntityManager 닫기
        }
        emf.close();  // EntityManagerFactory 닫기
    }
}

 


 

JPA 사용하기

 

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

@Entity // JPA 가 관리할 객체라는 것을 알림
public class Member {

    @Id // 데이터베이스의 PK를 나타냄
    @GeneratedValue // PK 생성 전략을 나타냄
    private Long id;
    private String name;

    // setter, getter ...
}

 

create table Member ( 
 id bigint not null, 
 name varchar(255), 
 primary key (id) 
);

 

Member 객체를 통해 아래와 같은 테이블을 생성 할 수 있습니다.

 

 

JPA 는 영속성 컨텍스트 라는 곳에 Entity를 등록하여 관리합니다.

이때 변화를 감지하여 등록, 수정, 삭제를 실행합니다.

 

 

등록 - 영속성 컨텍스트에 Entity를 추가하는 작업

 

public class Main {
    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.setName("memberA");

            em.persist(member); // 이부분에서 JPA 는 영속성 컨텍스트에 member 를 등록한다.

            tx.commit(); // commit 이 실행되면 jpa는 쿼리를 실행한다.
        } catch(Exception e) {
            tx.rollback();
        } finally {
            em.close();
        }
        emf.close();
    }
}

 

 

 

수정 - 영속성 컨텍스트에 등록된 Entity 의 값을 변경하는 작업

 

public class Main {
    public static void main(String[] args) {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        // hello 설정파일 설정정보

        EntityManager em = emf.createEntityManager();
        // db 작업은 EntityManager 로함

        EntityTransaction tx = em.getTransaction();
        // 모든 변경은 트랜잭션 안에서만 해야한다.

        tx.begin();

        try {

            Member member = new Member();
            member.setName("memberA");

            em.persist(member);

            Member findMember = em.find(Member.class, member.getId()); 
            findMember.setName("memberAA");

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

 

 

 

 

삭제 - 영속성 컨텍스트에서 삭제하는 작업

public class Main {
    public static void main(String[] args) {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        // hello 설정파일 설정정보

        EntityManager em = emf.createEntityManager();
        // db 작업은 EntityManager 로함

        EntityTransaction tx = em.getTransaction();
        // 모든 변경은 트랜잭션 안에서만 해야한다.

        tx.begin();

        try {

            Member member = new Member();
            member.setName("memberA");

            em.persist(member);

            Member findMember = em.find(Member.class, member.getId());
            em.remove(findMember);

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

 

 


참조

 

자바 ORM 표준 JPA 프로그래밍 - 김영한

'Java' 카테고리의 다른 글

JPA 객체와 테이블 매핑  (0) 2024.01.31
JPA Unknown entity 해결방법  (0) 2024.01.29
JPA 란?  (1) 2024.01.21
[Spring] variable not initialized in the default constructor 에러  (0) 2024.01.11
[Java] Reactive Streams 란?  (1) 2024.01.10