Java Persistence API
Hibernate
, EclipseLink
, DataNucleus
이다.
EntityManager.persist(entity);
EntityManager.persist(entity);
EntityManager.detach(entity);
: 특정 엔티티만 준영속 상태로 전환EntityManager.clear();
: 영속성 컨텍스트 초기화EntityManager.close();
: 영속성 컨텍스트 종료EntityManager.remove(entity);
💡 플러시(flush)란?
- 영속성 컨텍스트의 변경 내용을 데이터 베이스에 반영 (동기화)
- 엔티티 쓰기 지연 SQL 저장소의 쿼리를 데이터 베이스에 전송해준다.
- 플러시는 영속성 컨텍스트를 비우지 않는다.
- 트랜잭션이라는 작업 단위가 중요해진다.
- 플러시 호출 방법 : EntityManager.flush(), 트랜잭션 커밋, JPQL 쿼리 실행
// build.gradle
dependencies {
++ compile group: 'org.hibernate.javax.persistence', name: 'hibernate-jpa-2.1-api', version: '1.0.2.Final'
}
<!-- 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>
public class JpaMain {
public static void main(String[] args) {
final EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
final EntityManager em = emf.createEntityManager();
final EntityTransaction tx = em.getTransaction();
tx.begin(); // 트랜잭션 시작
try {
Member persistMember = new Member();
persistMember.setName("hello");
em.persist(persistMember); // 저장(Insert)
Member findMember = em.find(Member.class, 2L);
findMember.setName("changed"); // 수정(Update)
tx.commit(); // 트랜잭션 커밋
} catch (Exception e) {
tx.rollback(); // 에러 발생 시 트랜잭션 롤백
} finally {
em.close();
}
emf.close();
}
}
JPA는 객체를 RDB(관계형 데이터베이스)에 편리하게 저장하기 위한 자바 진영의 표준 ORM이다. SQL문을 직접 작성할 필요없이 기본 제공되는 API와 영속성 컨텍스트를 사용해서 객체를 효과적으로 저장하고 조회할 수 있다. 필요하다면 JPQL을 사용해서 custom 쿼리를 작성할 수도 있다.
스프링 프레임워크로 개발할 경우, JPA보다 한 단계 더 추상화된 Spring-Data-JPA를 사용하여 Auditing이나, named Query 등 더욱 편한 API를 사용할 수 있지만, 편리한 사용법만 익히기보다 JPA의 기본 원리를 학습한다면 개발할 때 폭넓은 제어가 가능할 것으로 생각된다.