JPA - 프로젝트 생성
> JPA를 사용하기 위해서는 hibernate-entitymanager 필요함
> persistence.xml파일이 필요 (Spring 없이 순수 자바에서 jpa 활용) > DB연동, 엔티티 매니저 팩토리 생성시 필요
> persistence-unit name에 매니저 팩토리 생성시 불러올 이름 지정
> javax.persistence로 시작하는 속성은 JPA표준 속성이고, hibernate로 시작하는 속성은 하이버네이트 전용 속성이다.
* 어떤 DB접근 기술을 사용하던 커넥션풀과 데이터 소스 등록필수!
<?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="he">
<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>
-> dialetc는 DB 방언 부분임
-> JPA는 특정 데이터 베이스에 종속적이지 않고, 어떤 DB를 사용하던 똑같이 서비스하도록 설계됨
-> 따라서 각 DB마다 문법과 함수가 다른것은 어떤 DB를 기준으로 쿼리를 작성하고 해석할 것인지 알려주는 작업이 필요하다
-> 여기서 방언이란 표준이 아닌, 특정 데이터 베이스에만 고유한 기능을 의미
2. JPA 작동 방식
- Persistence가 xml설정정보를 통해 매니저 팩토리 생성 -> 매니저를 통해서 JPA사용 (다른 DB접근 기술들과 유사)
- 트랜잭션마다 엔티티 매니저를 꼭 생성해서 사용해야한다 보통 앤티티 매니저들은 WAS가 내려갈때 같이 없어진다.
- 조회와 같은 작업은 트랜잭션이 없어도 작동하지만, 이외의 작업은 트랜잭션 단위에서 실행해야 반영된다!
3. 간단한 작동 예시
@Entity
public class Member{
@Id
private Long id;
private String name;
}
//..
{
//엔티티 매니저 생성
EntityManagerFactory emf = Persistence.createEntityManagerFactory("he");
//매니저 얻기
EntityManager em = emf.createEntityManager();
//트랜잭션 얻기
EntityTransaction tx = em.getTransaction();
//정석대로 사용하는 방법 -> jpa 순수
tx.begin();
try{
Member member = new Member();
member.setId(2L);
member.setName("HelloB");
em.persist(member);
//기존에 등록된 member update
Member findmember = em.find(Member.class, 1L);
findmember.setName("helloJPA");
tx.commit();
}catch (Exception e){
tx.rollback(); //에러 발생시 롤백
e.printStackTrace();
}finally {
//작업 완료후 em반환하기
em.close();
}
//다 끝나면 닫아주기
emf.close();
}
> @Entity: JPA가 관리할 객체
> @Id: 데이터베이스 PK와 매핑
> 엔티티 매니저는 쓰레드 사이에서 공유하면 안된다. -> 사용 후 close
> 업데이트는 비교적 간단. 영속성에서 관리해주는 Entity라면 그냥 변경하면 SQL 혹은 Commit시점에 변경감지를 통해 적용
> JPA의 장점은 객체간 그래프 탐색(a.get().get())이 가능하다는 점이다! -> DB를 객체지향스럽게 사용할 수 있다.
4. JPQL
> JPA는 검색시에도 테이블이 아닌 엔티티 객체를 대상으로 섬색
> 모든 데이터를 객체로 변환해서 검색하는 것은 불가능하다! 따라서 SQL도 당연히 필요하다.
> JPQL은 SQL을 추상화해서 객체 지향 쿼리 언어를 제공한다. (엔티티 객체를 대상으로 쿼리를 날린다)