[자바 ORM 표준 JPA 프로그래밍] Hello World 프로젝트 ( 2/2 )
- JPA 설정하기 ( persistence.xml)
- JPA 설정파일
- /META-INF/persistence.xml 위치
- persistence-unit name으로 이름 지정
- javax.persistence로 시작 : JPA 표준 속성
- hibernate로 시작 : 하이버네이트 전용 속성
- persistence.xml 생성( 위치 : src/main/resources/META-INF/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="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는 특정 데이터베이스에 종속적이지 않습니다.
- 각각의 데이터베이스가 제공하는 SQL 문법과 함수는 조금씩 다릅니다.
- 가변 문자 : Mysql은 VARCHA, Oracle은 VARCAR2
- 문자열을 자르는 함수 : SQL 표준은 SUBSTRING(), Oracle은 SUBSTR()
- 페이징 : MySQL은 LIMIT, Oracle은 ROWNUM
- 방언 : SQL 표준을 지키지 않는 특정 데이터베이스만의 고유한 기능
- hibernate.dialect 속성에 데이터베이스 지정
- H2 : org.hibernate.dialect.H2Dialect
- Oracle 10g : org.hibernate.dialect.Oracle10gDialect
- MySQL : org.hibernate.dialect.MySQL5InnoDBDialect
※ 하이버네이트는 40가지 이상의 데이터베이스 방언을 지원합니다.
- EntityManagerFactory와 EntityManager
- EntityManagerFactory는 고객의 요청이 올 때마다 (thread가 하나 생성될 때마다) EntityManager를 생성하다.
- EntityManager는 내부적으로 DB connection pool을 사용해서 DB에 접근한다.
- EntityManagerFactory
- JPA는 EntityManagerFactory가 만들어야 한다.
- application loading 시점에 DB당 딱 하나만 생성되어야 한다.
- EntityManager
- 실제, Transaction 단위를 수행할 때마다 생성한다.
- 즉, 고객의 요청이 올 때마다 사용했다가 닫는다.
- thread 간에 공유하면 안된다.(사용 후 버림)
- EntityManager인스턴스생성 후 close()메서드 반드시 호출
- Transaction 수행 후에는 반드시 EntityManager를 닫는다.
- 그래야 내부적으로 DB Connection을 반환한다.
- EntityTransaction
- Data를 "변경"하는 모든 작업은 반드시 Transaction 안에서 이루어 져야 합니다.
- JPA 작동 방식
※ Persistenct 클래스에서 설정 정보(1)를 읽어서 EntityManagerFactory 생성(2) 후 EntityManager 들을 생성(3)합니다.
- 실습진행
https://github.com/oss0202/ex1-hello-jpa/blob/master/src/main/java/hellojpa/JpaMain.java
oss0202/ex1-hello-jpa
JPA Hello World. Contribute to oss0202/ex1-hello-jpa development by creating an account on GitHub.
github.com
1. 테이블 생성
create table Member (
id bigint not null,
name varchar(255),
primary key (id)
);
2. Entity 생성
package hellojpa;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Member {
@Id
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3. Persist 실행
package hellojpa;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
public class JpaMain {
public static void main(String[] args) {
// 1. EntityManagerFactory 생성(persistence.xml name 매칭)
// application loading 시점에 DB당 딱 하나만 생성되어야 한다.
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("hello");
// 2. EntityManager 생성
EntityManager entityManager = entityManagerFactory.createEntityManager();
//transaction 처리가 반드시 있어야 한다.
EntityTransaction tx = entityManager.getTransaction();
tx.begin();
// 3. 실제 code 작성
Member member = new Member();
member.setId(1L);
member.setName("HelloA");
entityManager.persist(member);
tx.commit();
entityManager.close();
//WAS 가 종료되는 시점에 EntityManagerFactory 를 닫는다
// -> 내부적으로 Connection pooling에 대한 Resource가 Release된다.
entityManagerFactory.close();;
}
}
※ Entity, Column이 실제 테이블과 다를 경우 매핑을 해주면 됩니다.
// Table 매핑
...
@Entity
@Table(name = "USER")
public class Member {
...
// Column 매핑
...
@Column(name - "username")
private String name;
...
- 정석코드 ( try ~ catch)
https://github.com/oss0202/ex1-hello-jpa/blob/master/src/main/java/hellojpa/JpaMainFind.java
oss0202/ex1-hello-jpa
JPA Hello World. Contribute to oss0202/ex1-hello-jpa development by creating an account on GitHub.
github.com
- Update
// 별도로 persist 메서드를 호출해서 저장할 필요가 없다.
findMember.setName("HelloJPA");
https://github.com/oss0202/ex1-hello-jpa/blob/master/src/main/java/hellojpa/JpaMainUpdate.java
oss0202/ex1-hello-jpa
JPA Hello World. Contribute to oss0202/ex1-hello-jpa development by creating an account on GitHub.
github.com
- Delete
// 찾은 객체를 넣어주면 된다.
em.remove(findMember);
https://github.com/oss0202/ex1-hello-jpa/blob/master/src/main/java/hellojpa/JpaMainDelete.java
oss0202/ex1-hello-jpa
JPA Hello World. Contribute to oss0202/ex1-hello-jpa development by creating an account on GitHub.
github.com
- JPQL
- SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공
- JPQL은 엔티티 객체를 대항으로 쿼리(DB를 변경해도 쿼리변경 불필요)
- SQL은 데이터베이스 테이블을 대상으로 쿼리
- SQL과 문법 유사, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원
- 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요
https://github.com/oss0202/ex1-hello-jpa/blob/master/src/main/java/hellojpa/JpaMainJPQL.java
oss0202/ex1-hello-jpa
JPA Hello World. Contribute to oss0202/ex1-hello-jpa development by creating an account on GitHub.
github.com
출처
https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., 본 강의는 자바 백엔
www.inflearn.com