- 객체는 객체대로, RDB는 RDB대로 설계 후
- 그 사이의 불일치는 ORM이 SQL을 자동 생성하여 해결해 준다는 뜻
- JPA는 ORM을 구현한 기술 중 하나 : 객체를 통해 데이터베이스를 조작할 수 있는 API를 제공하는 것
// 오라클 10g 방언으로 사용
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.oracle.database.jdbc:ojdbc8'
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">
<properties>
<!-- 필수 속성 -->
<property name="javax.persistence.jdbc.driver" value="oracle.jdbc.driver.OracleDriver" />
<!-- oracle id, password -->
<property name="javax.persistence.jdbc.user" value="spring" />
<property name="javax.persistence.jdbc.password" value="spring" />
<property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@localhost:1521:xe" />
<!-- 오라클 10g 방언으로 사용 -->
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
<!-- Postgre : 웬만한 쿼리 다 가능 -->
<!-- <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL10Dialect" /> -->
<property name="hibernate.hbm2ddl.auto" value="create" />
<!-- value = none or value = create -->
<!-- 옵션 -->
<!-- 콘솔에 하이버네이트가 실행하는 SQL문 출력 -->
<property name="hibernate.show_sql" value="true" />
<!-- SQL 출력 시 보기 쉽게 정렬 -->
<property name="hibernate.format_sql" value="true" />
<!-- 쿼리 출력 시 주석(comments)도 함께 출력 -->
<property name="hibernate.use_sql_comments" value="true" />
</properties>
</persistence-unit>
</persistence>
@Entity
@Getter @Setter
public class Member {
@Id
private Long id;
private String name;
}
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf
= Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
// transaction 선언
EntityTransaction tx = em.getTransaction();
// transaction 시작
tx.begin();
try {
// 추가
Member member = new Member();
member.setId(2L);
member.setName("UserB");
em.persist(member);
// 회원조회
Member findMember = em.find(Member.class, 1L);
System.out.println("findMember.id : " + findMember.getId());
System.out.println("findMember.name : " + findMember.getName());
// 회원 수정
findMember.setName("HelloJPA");
// 회원 삭제
em.remove(findMember);
// transaction 커밋
tx.commit();
// 커밋과 커밋 사이를 하나의 트랜잭션 단위 = 비즈니스 단위
// 오류 나면 트랜잭션 자체가 롤백
}catch (Exception e) {
tx.rollback();
} finally {
em.close();
emf.close();
}
}
}
jpa 세팅을 위한 기본 프레임
package com.codingbox.jpa; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; public class Jpabasic { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); try { tx.commit(); } catch (Exception e) { tx.rollback(); } finally { em.close(); emf.close(); } } }
- @Entity 있으면 기본 프레임만 실행해도 테이블 생성