이 글에서는 JPA 설정에 대해 설명한다.
pom.xml
에 hibernate-entity, database driver 추가<!-- JPA 하이버네이트 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>6.4.2.Final</version>
</dependency>
<!-- H2 데이터베이스 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.3.230</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
hibernate 6.4.2.Final 버전 사용하고 JPA 표준과 하이버네이트를 포함하는 라이브러리를 추가함으로써 종속성 라이브러리도 함께 내려받는다.
데이터베이스는 자신이 사용한 데이터베이스 버전에 맞춰줘야 한다. 필자는 h2 데이터베이스의 2.3.230 버전이므로 maven에서도 일치시켰다.
자바 11을 사용하는 경우 java.xml.bind를 추가해주어야 한다.
자바 11부터는 해당 라이브러리가 자바 기본에서 빠져있어 이와 같은 에러 발생 가능.
Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
src/main/java/resources/META_INF/persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- JPA 버전 : 2.2 -->
<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">
<!-- JPA 이름 : hello -->
<persistence-unit name="hello">
<properties>
<!-- 필수 속성 : 데이터베이스 접근 정보 -->
<property name="jakarta.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="jakarta.persistence.jdbc.user" value="sa"/>
<property name="jakarta.persistence.jdbc.password" value=""/>
<property name="jakarta.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.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence>
<!-- H2 -->
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
<!-- Oracle -->
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
<!-- MySQL -->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect"/>
package hellojpa;
import jakarta.persistence.*;
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("hello");
EntityManager entityManager = entityManagerFactory.createEntityManager();
EntityTransaction entityTransaction = entityManager.getTransaction();
entityTransaction.begin();
try {
Member member = new Member();
member.setId(1L);
member.setName("A");
entityManager.persist(member);
entityTransaction.commit();
} catch (Exception e) {
entityTransaction.rollback();
} finally {
entityManager.close();
}
entityManagerFactory.close();
}
}
EntityMangerFactory 생성
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("hello");
META-INF/persistence.xml
에서 이름이 jpabook인 영속성 유닛(persistence-unit)을 찾아서 엔티티 매니저 팩토리를 생성한다. EntityManger 생성
EntityManager entityManager = emf.createEntityManager();
EntityTransaction 관리
EntityTransaction tx = em.getTransaction();
tx.begin();
tx.commit();
종료
em.close();
emf.close();
등록, 수정, 삭제, 조회 작업은 엔티티 매니저를 통해서 수행된다.
//객체 생성
Member member = new Member();
member.setId(1L);
member.setName("A");
//Create
em.persist(member);
//한 건 조회, Read
Member findMember = em.find(Member.class, 1L);
System.out.println(findMember.getId()); // 1
System.out.println(findMember.getName()); // "A"
//Update
Member updateMember = em.find(Member.class, 1L);
updateMember.setName("B");
//Delete
Member deleteMember = em.find(Member.class, 1L);
em.remove(deleteMember);
//목록 조회, Read (JPQL)
List<Member> result = em.createQuery("select m from Member as m", Member.class).getResultList();
for (Member mem : result) {
System.out.println("member.getName() = " + mem.getName());
}
em.persist(member);
//1개 조회
Member findMember = em.find(Member.class, 1L);
//목록 조회 (JPQL)
List<Member> result = em.createQuery("select m from Member as m", Member.class) .getResultList();
updateMember.setName("helloJPA");
em.remove(deleteMember);