<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.6.12.Final</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.1.214</version>
</dependency>
</dependencies>
persistence.xml 설정
<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
-> 설정 정보 조회 (persistence.xml) -> 생성EntityManagerFactory
-> EntityManager
생성public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
// persistence.xml 에서 지정한 name
EntityManager em = emf.createEntityManager();
em.close();
emf.close();;
}
}
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); // persistence.xml 에서 지정한 name
// 애플리케이션 실행 시점에 1번 생성
EntityManager em = emf.createEntityManager();
// DB Connection을 얻어 쿼리를 날리고 종료하는 과정마다 생성해줘야 함
EntityTransaction tx = em.getTransaction();
tx.begin(); // 모든 과정이 트랜잭션 하나에서 실행되어야 함
Member member = new Member();
member.setId(1L);
member.setName("HelloA");
em.persist(member);
tx.commit(); // 트랜잭션 커밋
em.close();
emf.close();;
try {
Member findMember = em.find(Member.class, 1L);
findMember.setName("HelloJPA");
// em.persist(findMember); -> 저장을 굳이 하지 않더라도 수정된 정보가 저장됨
// JPA가 관리할 때 트랜잭션 직전에 정보가 바뀐 것을 캐치하여 update를 해줌줌
tx.commit(); // 트랜잭션 커밋
} catch (Exception e) { // 문제 상황 시 롤백
tx.rollback();
} finally { // 어쨌든 em을 닫아줘야 함
em.close();
}
emf.close();
}
주의사항
EntityManagerFactory
는 하나만 생성, 애플리케이션 전체에서 공유EntityManager
는 쓰레드 간에 공유하지 않고 사용하고 버려야 한다JPQL 소개
try {
// Member findMember = em.find(Member.class, 1L);
List <Member> result = em.createQuery("select m from Member as m", Member.class)
.setFirstResult(5) // pagination 시작 지점
.setMaxResults(8) // pagination 종료 지점
.getResultList();
// JPA는 테이블을 대상으로 코드를 짜는 것이 아니며 객체를 대상으로 짬 (Member 테이블이 아닌, Member 객체)
// DB 방언에 맞춰서 번역이 되어 DB에 쿼리를 쏨
for (Member member : result) {
System.out.println("member.name = " + member.getName());
}
Member member = new member();
member.setId("member1");
member.setUserName("김쾅쾅");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.persist(member);
em.detach(member);
em.remove(member);
-> 스레드, runnable 객체랑 비슷한 것 같은데 Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member2");
System.out.println(a == b); // 동일성 비교 true
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin(); // 트랜잭션 시작
em.persist(memberA);
em.persist(memberB);
// 여기까지는 영속화만 진행할 뿐, 커밋을 하지 않아 DB에 INSERT SQL을 보내지 않음
// 쓰기 지연 SQL 저장소에 저장
tx.commit(); // 트랜잭션 커밋, 이 시점에 DB에 INSERT SQL 전송
// 쓰기 지연 SQL 저장소에 있는 SQL INSERT를 flush