JAN's History
JPA기본기 다지기_JPA 기초와 매핑 본문
객체 매핑하기
- @Entity : JPA가 관리할 객체
- @Id : DB PK와 매핑할 필드
@Entity
public class Member{
@Id
private Long id;
private String name;
...
}
CREATE TABLE member (
id bigint not null,
name varchar(255),
...
primary key (id)
);
persistence.xml
- JPA 설정 파일
- 경로 : /META-INF/persistence.xml
- javax.persistence로 시작: JPA 표준 속성
- hibernate로 시작 : Hibernate 전용 속성
dialect? 데이터베이스 방언!
- JPA는 특정 DB에 종속적이지 않은 기술!
- 하지만 DB 사정은 다르다! 벤더마다 조금씩 다름
- MySQL - VARCHAR / Oracle - VARCHAR2
- MySQL - LIMIT / Oracle - ROWNUM
- 하지만 DB 사정은 다르다! 벤더마다 조금씩 다름
- hibernate.dialect
- H2 (org.hibernate.dialect.H2Dialect)
- Oracle 10g (org.hibernate.dialect.Oracle10gDialect)
- MySQL (org.hibernate.dialect.MySQL5InnoDBDialect)
- etc...
실습
1. H2 Database 설치
- H2 Console.exe를 찾은 후 실행
- 인터넷 브라우저 주소창에서 localhost의 8082 포트로 접속 (localhost:8082)
- member 테이블 생성
CREATE TABLE member (
id bigint not null,
name varchar(255),
primary key (id)
);
3. STS에 Maven 프로젝트 생성
<dependencies>
<!-- Hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.4.0.Final</version>
</dependency>
<!-- H2 Database -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.197</version>
<!-- <scope>test</scope> -->
</dependency>
</dependencies>
5. JPA 설정 파일 생성
resources/META-INF/persistence.xml 생성하기
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.2">
<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"/>
</properties>
</persistence-unit>
</persistence>
persistence.xml에 위에 내용 복사 + 붙여넣기
➡️ hibernate를 기본으로 JDBC를 사용한다는 뜻
6. Member class 생성
package hellojpa.entity;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity // JPA의 객체이다!
public class Member {
@Id // PK값이다!
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;
}
}
7. Main class 및 method 생성
package hellojpa;
import hellojpa.entity.Member;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
public class Main {
public static void main(String[] args) {
// 1. EntityManagerFactory 생성
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
// 2. EntityManagerFactory를 통해 EntityManager 생성
EntityManager em = emf.createEntityManager();
// 3. EntityManager를 통해 트랜잭션 획득
EntityTransaction tx = em.getTransaction();
// 4. 트랜잭션 시작
tx.begin();
// 5. 새로 삽입할 Member 객체 생성
Member member = new Member();
member.setId(100L);
member.setName("안녕하세요");
// 6.EntityManager를 통해 생성한 Member 객체 저장
em.persist(member);
// 7. 트랜잭션 커밋
tx.commit();
// 8. EntityManagerFactory 및 EntityManager 종료
em.close();
emf.close();
}
}
실행
실행 후 확인!
9. 좀 더 보완해보자
트랜잭션을 처리하다가 중간에 에러가 날 수도 있다. 이런 경우 트랜잭션의 특징 중 하나인 원자성을 지키기 위해 롤백을 해준다.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
// 에러 났을 경우를 대비해 try-catch로 처리
try {
// 5. 새로 삽입할 Member 객체 생성
Member member = new Member();
member.setId(100L);
member.setName("안녕하세요");
// 6.EntityManager를 통해 생성한 Member 객체 저장
em.persist(member);
// 7. 트랜잭션 커밋
tx.commit();
} catch (Exception e) {
// 8. 실패하면 롤백!
tx.rollback();
} finally {
// 잘 처리되든 말든
// 9. EntityManagerFactory 및 EntityManager 종료
em.close();
emf.close();
}
- EntityManagerFactory는 하나만 생성해서 애플리케이션 전체에서 공유
- EntityManger는 쓰레드간 공유하면 안됨(사용하고 버리자)
- JPA의 모든 데이터는 트랜잭션 안에서 실행
더 알아볼 것
- 연관관계
- 쓰레드
'JPA' 카테고리의 다른 글
JPA기본기 다지기_JPA 내부구조 (0) | 2024.03.25 |
---|---|
JPA기본기 다지기_양방향 매핑(복습...@_@) (0) | 2024.03.24 |
JPA기본기 다지기_연관관계 매핑(복습..복습..복습....) (0) | 2024.03.23 |
JPA기본기 다지기_필드와 컬럼 매핑 (1) | 2024.03.22 |
JPA소개 (0) | 2024.03.21 |