애플리케이션이 실행되면 단 1개의 EntityManagerFactory 가 생성되고, 종료되면 없어진다.
하나의 트랜잭션(쓰레드)가 생성될 때마다 EntityManagerFactory 가 EntityManager을 생성해준다.
JPA의 모든 데이터 변경은 트랜잭션 안에서 실행된다.
EntityManager는 쓰레드 간에 공유하면 안된다. 사용하고 버려야 한다.
JPA를 사용하면 SQL 이 아닌 엔티티를 중심으로 개발하게 된다.
JPA는 SQL을 추상화한 객체지향 쿼리언어 JPQL을 제공한다.
SQL과 문법은 유사하다.
JPQL는 엔티티 객체를 대상으로, SQL은 데이터베이스 테이블을 대상으로 쿼리를 날린다.
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>
javax.persistence.jdbc.~
jdbc url 및 password 등을 설정하는 속성이다.
JPA는 특정 데이터베이스에 종속하지 않는다.
hibernate.dialect 로 H2, MySQL, Oracle 등 각각에 해당하는 데이터베이스 방언을 지정해줄 수 있다.
hibernate.show_sql 는 데이터베이스로 쿼리가 나가는 모습을 터미널을 통해 보여줄 지 설정하는 옵션이다.
hibernate.format_sql 는 hibernate.show_sql 와 같이 사용되는 옵션으로, 쿼리를 보기 좋게 만들어주는 옵션이다.
hibernate.use_sql_comment 는 쿼리 앞에 /* */ 로 쿼리에 대한 설명을 추가적으로 붙여준다.
hibernate.hbm2ddl.auto 는 데이터베이스 스키마를 애플리케이션 실행 시점에서 자동으로 생성할 수 있도록 설정하는 옵션이다.
@Entity
@Getter @Setter
public class Member {
@Id
private Long id;
private String name;
}
public class JpaMain {
public static void main(String[] args){
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();
try{
Member member = new Member();
member.setId(1L);
member.setName("JPA");
em.persist(member);
transaction.commit();
}catch(Exception e){
transaction.rollback();
}finally {
em.close();
}
emf.close();
}
}
Member member = em.find(Member.class, 1L);
em.remove(member)
List<Member> result = em.createQuery("select m from Member m where m.id >= 2", Member.class)
.setFirstResult(0)
.setMaxResults(3)
.getResultList();
김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 을 공부하며 정리한 내용입니다.