<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1">
<persistence-unit name="jpabook">
<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.id.new_generator_mappings" value="true" />
<property name="hibernate.hbm2ddl.auto" value="create" />
</properties>
</persistence-unit>
</persistence>
@Entity
: 해당 클래스를 테이블과 매핑한다고 JPA에게 알린다. → 엔티티 클래스@Table
: 엔티티 클래스에 매핑할 테이블 정보를 알려준다. (생략시 클래스 이름 == 테이블 이름)@Id
: 엔티티 클래스의 필드를 테이블의 기본키 (PK)에 매핑. 해당 애노테이션이 적용된 필드를 식별자 필드라고 한다.@Column
: 필드를 컬럼에 매핑한다. 여기서는 name 속성을 사용해서 Member 엔티티의 username을 테이블의 NAME 컬럼에 매핑했다.@Setter @Getter
@Entity
@Table(name="MEMBER")
public class Member {
@Id @Column(name="ID")
private String id;
@Column(name="NAME")
private String username;
private Integer age;
}
public class Application {
public static void main(String[] args) {
//[엔티티 매니저 팩토리] - 생성
EntityManangerFactory emf = Persistence.createEntityManagerFactory("jpabook");
//[엔티티 매니저] - 생성
EntityManager em = emf.createEntityManager();
//[트랜잭션] - 획득
EntityTransaction tx = em.getTransaction();
try {
tx.begin();
logic(em);
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
persistence.xml
의 설정 정보를 사용해 엔티티 매니저 팩토리를 생성한다. 이때 Persistence 클래스를 생성하는데 이 클래스에서 엔티티 매니저 팩토리를 생성해서 JPA를 사용할 수 있게 준비한다.//[엔티티 매니저 팩토리] - 새성
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
//[엔티티 매니저] - 생성
EntityManager em = emf.createEntityManager();
em.close(); //[엔티티 매니저] - 종료
emf.close(); //[엔티티 매니저 팩토리] - 종료
JPA를 사용하면 항상 트랜잭션 안에서 데이터를 변경해야 한다. 트랜잭션 없이 데이터를 변경하면 예외가 발생한다.
try {
tx.begin(); //[트랜잭션] - 시작
logic(em); //비즈니스 로직 실행
tx.commit(); //[트랜잭션] - 커밋
} catch(Exception e) {
tx.rollback(); //[트랜잭션] - 롤백
}
String id = "id1";
Member member = new Member();
member.setId(id);
member.setUsername("zenon");
em.persist(member);
INSERT INTO member(id, name) VALUES('id1', 'zenon');
JPA는 어떤 엔티티가 변경되었는지 추적하는 기능을 갖추고 있다. 따라서 값만 변경하면 UPDATE SQL을 생성해서 값을 변경한다.
member.setName("xellos");
UPDATE member SET name = 'xellos' WHERE id = 'id1';
em.remove(member);
DELETE FROM member WHERE id = 'id1';
find() 메서드는 조회할 엔티티 타입과 @Id
로 DB 테이블의 기본 키와 매핑한 식별자 값으로 엔티티 하나를 조회하는 가장 단순한 메서드다.
Member findOne = em.find(Member.class, id);
SELECT * FROM member id = 'id';
아래 사용한 쿼리문은 SQL을 추상화한 JPQL(Java Persistence Query Language) 라는 객체 지향 쿼리언어다.
TypeQuery<Member> query = em.createQuery("SELECT m FROM Member m", Member.class);
List<Member> members = query.getResultList();