JPA 공부일기(2)
[자바 ORM 표준 JPA 프로그래밍 - 기본편] Hello JPA - 프로젝트 생성 ~ Hello JPA - 애플리케이션 개발
pom.xml에 dependency추가
- JPA 하이버네이트: spring boot 버전에 맞추어 호환되는 org.hibernate 버전 사용.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>jpa-basic</groupId>
<artifactId>ex1-hello-jpa</artifactId>
<version>1.0.0</version>
<dependencies>
<!-- JPA 하이버네이트 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.3.10.Final</version>
</dependency>
<!-- H2 데이터베이스 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.199</version>
</dependency>
</dependencies>
</project>
persistence.xml에 jdbc 연결 속성 추가
- JPA는 특정 데이터베이스에 종속되지 않음.
- 사용하는 데이터베이스에 따라 hibernate.dialect 속성에 지정하면 데이터베이스 방언(특정 데이터베이스만의 고유 기능)지원.
· h2: org.hibernate.dialect.H2Dialect
· Oracle 10g: org.hibernate.dialect.Oracle10gDialect
· MySQL: org.hibernate.dialect.MySQL5InnoDBDDialect
<?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="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.hbm2ddl.auto" value="create" />-->
</properties>
</persistence-unit>
</persistence>
JPA 구동방식
1.Persistence 클래스에서 META-INF/persistence.xml 파일의 설정 정보를 조회해서 2.EntityManagerFactory 클래스를 생성. 3. 요청이 올 때마다 EntityManager( DB 커넥션을 얻어서 쿼리를 날리고 종료되는 한 단위 동안 사용)를 생성해서 사용.
- EntityManagerFactory는 하나만 생성해서 애플리케이션 전체에서 공유.
- EntityManager는 쓰레드 간에 공유x(사용하고 버려야한다).
- JPA의 모든 데이터 변경은 트랜잭션 안에서 실행.
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 {
List<Member> result = em.createQuery("select m from Member as m", Member.class);
for(Member member : result) {
System.out.println("member.name = " + member.getName());
}
tx.commit();
} catch(Exception e) {
tx.rollback();
} finally{
em.close();
}
emf.close();
}
}
@Entity: JPA가 관리할 객체
@Table(name="테이블명"): 객체명과 테이블명이 다를 때 테이블명을 적어서 매핑되도록 함.
@Id: 데이터베이스 pk와 매핑
@Coulmn(name="컬럼명"): 객체의 컬럼명과 테이블 컬럼명이 다를 때 테이블 컬럼명을 적어서 매핑되도록 함.