JPA의 구동방식을 아래 이미지로 보고 시작하자!
1. EntityManagerFactory
- 데이터베이스당 하나만 생성하여 전체에서 공유하여 사용해야 한다.
- 여기에 들어가는 name은 persistence.xml의 unit name 이다.
2. EntityManager
- EntityManager는 다른 쓰레드들과 공유하면 안된다. ( Connection과 같다고 보면됨 / conn도 쓰고 close로 버리는것 처럼 얘도 close가 필수다! )
- 모든 DB 접근은 Manager를 거쳐야한다.
3. EntityTransaction
- DB에 삽입, 수정 등 이용할 때 트랜잭션 받아와서 사용하는게 필수!
- JPA의 모든 데이터 변경은 트랙잭션 안에서 수행한다. ( 조회-select 는 예외 일 수 있음 )
4. JPQL
- JPQL은 객체 지향 쿼리 이다.
- 우리가 조건을 가진 쿼리를 써야 할 때는 SQL 작성이 불가피 할 수 있다. 이때 JPA에서 쓰는게 JPQL!
- JPQL은 엔티티 객체를 중심으로, SQL은 데이터베이스 테이블 중심으로 쿼리를 생성한다.
예시 코드
package hellojpa;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import java.util.List;
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try{
/* 삽입 */
/*Member member = new Member();
member.setId(2L);
member.setName("HelloB");
em.persist(member);*/
/* 조회 */
Member findMember = em.find(Member.class, 1L);
/* 수정 */
/* 따로 수정 후 저장해 주지 않아도 트랜잭션 커밋하기 전에
* 수정 된 걸 확인 하고 JPA가 알아서 update 쿼리를 날림 */
findMember.setName("HelloJPA");
/* JPQL(객체지향쿼리) - 쿼리를 써야할때가 있다. 그때 사용함
* JPQL은 엔티티 객체를 중심으로, SQL은 데이터베이스 테이블 중심으로 쿼리를 날린다.
* */
List<Member> result = em.createQuery("select m from Member as m ", Member.class)
.getResultList();
for (Member member : result) {
System.out.println("member name : " + member.getName());
}
tx.commit();
}catch (Exception e){
//중요!! 문제가 발생하면 rollback
tx.rollback();
}finally {
em.close();
}
emf.close();
}
}
'JAVA' 카테고리의 다른 글
[JAVA] JPA 플러시(flush) (0) | 2021.11.09 |
---|---|
[JAVA] JPA 영속성 관리 (0) | 2021.11.09 |
[JAVA] JPA 프로젝트 생성(Maven) + 기본설정 (0) | 2021.11.02 |
[JAVA] JPA란? (0) | 2021.09.09 |
[JAVA] build (0) | 2021.03.24 |