JPA를 이용한 애플리케이션 개발
엔티티 매니저 설정
//엔티티 매니저 팩토리 생성
//persistence.xml에 있는 persistence-unit name명으로 생성
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
EntityManager em = emf.createEntityManager(); //엔티티 매니저 생성
EntityTransaction tx = em.getTransaction(); //트랜잭션 기능 획득
try {
Member member = new Member();
member.setId(1L);
member.setName("hello");
//트랜잭션 시작
tx.begin();
//등록
em.persist(member);
//수정
member.setAge(20);
//한 건 조회
Member findMember = em.find(Member.class, id);
System.out.println("findMember=" + findMember.getUsername() + ", age=" + findMember.getAge());
//목록 조회
List<Member> members = em.createQuery("select m from Member m", Member.class).getResultList();
System.out.println("members.size=" + members.size());
//삭제
em.remove(member);
//트랜잭션 커밋
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback(); //트랜잭션 롤백
} finally {
em.close(); //엔티티 매니저 종료
}
emf.close(); //엔티티 매니저 팩토리 종료
엔티티 매니저 팩토리
한 개만 만들어서 어플리케이션 전체에서 공유하도록 설계.
여러 스레드가 동시에 접근해도 안전, 서로 다른 스레드 간 공유 가능.
엔티티 매니저 생성
EntityManager em = emf.createEntityManager();
엔티티 매니저를 사용해서 엔티티를 데이터베이스에 등록/수정/삭제/조회할 수 있다.
엔티티 매니저는 데이터베이스 커넥션과 밀접한 관계가 있으므로 스레드간에 절대로 공유하거나 재사용하면 안된다.
종료
사용이 끝난 엔티티 매니저는 반드시 종료
수정
em.update()를 호출할 것 같은데 없다.
단순하게 엔티티의 값만 변경.
JPA는 어떤 엔티티가 변경되었는지 추적하는 기능을 갖추고 있음.
문제점
엔티티 대상으로 검색해야 함.
그러나 테이블이 아닌 엔티티 객체를 대상으로 검색하려면 데이터베이스 모든 데이터를 어플리케이션으로 불러와 엔티티 객체로 변경해서 검색해야 함.
해결
JPA는 JPQL(Java Persistence Query Language)라는 쿼리 언어로 해결.
차이점
JPQL : 엔티티 객체를 대상으로 쿼리. (클래스와 필드)
SQL : 데이터베이스 테이블을 대상으로 쿼리.
샘플
select m from Member m
JPQL 표현
from Member는 Member 테이블이 아닌 Member 회원 엔티티 객체
JPQL은 데이터베이스 테이블을 전혀 알지 못한다.
JPA는 JPQL을 분석, 적절한 SQL을 만들어 데이터베이스에 데이터 조회.
JPQL은 대소문자를 구분.
SELECT M.ID, M.NAME, M.AGE FROM MEMBER M