<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>
개인적으로 JPA 설정 파일에서
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
DB에 따라 맞춰서 여러종류의 RDB마다 조금씩 다른 sql 문법을 보정할 수 있다는게 큰 장점 같다. myBatis같은 경우는 sql문을 직접 작성하다보니 거의 없겠지만 RDB종류를 변경하면 미묘한 차이에서 수정해줘야하는 과정이 필요하다.
Persistence -> META-INF/persistence.xml JPA 설정 정보를 조회 ->
Persistence -> EntityMangerFactory 클래스 생성(하나만 생성해서 애플리케이션 전체 공유)
-> EntityManager 다수 생성 (쓰레드 간에 공유x 사용하고 사라짐)
JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공
JPA를 사용하면 엔티티 객체를 중심으로 개발한다.
검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색한다.
왜냐하면 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능하고 애플리케이션이 필요한 데이터만 물리적으로 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요하기 때문에 코드가 SQL에 종속적이게 된다
위와 같이 엔티티객체에 대한 쿼리문에 대해 검색할 수 있는 JPQL은 가장 단순한 조회 방법이다.
ex) 나이가 18살 이상인 회원을 모두 검색하고 싶다면?
보통의 조회는 EntityManager.find(~~.class , ~~);
이런식인데 검색조건이 붙으면 JPQL을 사용
EntityManager.createQuery("쿼리문" , ~~.class).getResultList();
이런식으로 사용
SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않으며, JPQL을 한마디로 정의하면 객체 지향 SQL이다
엔티티 등록
1. persist(~~) 메서드 사용
2. 영속 컨텍스트 내에 1차 캐시에 @Id와 엔티티 저장 그리고 쓰기 지연 SQL 저장소에 SQL문 생성 후 저장
3. commit 과 함께 DB로 SQL문을 넘긴다.
4. 영속성 컨텍스트 사라짐
조회
1.find(~~~) 메서드 사용
2. 영속 컨텍스트 내에 1차 캐시에서 찾는다. 없으면 DB에서 찾은 뒤 1차캐시에 저장한다.
3. 1차캐시에서 엔티티를 반환
//1. 객체를 생성한 상태(비영속)
Member member = new Member();
member.setId("member1");
member.setUsername(“회원1”);
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
//2. 객체를 저장한 상태(영속) - 이 때부터 영속 상태로 관리되기 시작
// (DB에 저장되는 시기는 아니다. 트랜잭션에서 커밋되어야 DB로 넘어감)
em.persist(member);
//3.회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태
em.detach(member);
//4.객체를 삭제한 상태(삭제)
em.remove(member);