<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"/>
javax는 다른 jpa 구현 라이브러리를 써도 그래로 쓸 수 있다.
표준을 지키는 것.
hibernate는 바꾸게 되면 옵션들도 다 바꿔야
Persistence는 META-INF/persistence.xml 설정 정보를 조회 한 후,
EntityManagerFactory 라는 클래스를 만든다. 그리고 여기서 필요할 때마다 EntityManager를 만들어서 쓴다.
EntityManagerFactory를 만드는 순간 데이터베이스와 연결도 다 되고,
웬만한게 다 됨.
@Entity: JPA가 관리할 객체
@Entity를 꼭 넣어주어야 JPA가 처음 로딩될떄 JPA를 사용하는 애구나 인식하고 내가 관리해야겠다고 인식하게 됨.
@Id: 데이터베이스 PK와 매핑
PK라는걸 알려줘야함
member.setId(1L);
long값이어서 L을 붙인거임
JPA에선 트랜잭션이 제일 중요.
JPA에서 작업을 하려면 트랜잭션 안에서 작업을 해야한다.
<!-- 옵션 -->
<property name="hibernate.show_sql" value="true"/> //sql 날리는거 보여줌
<property name="hibernate.format_sql" value="true"/> //예쁘게 출력해줌
<property name="hibernate.use_sql_comments" value="true"/> //위에 주석
데이터베이스 테이블의 이름이 다를 수 있다...!
그럴땐 Member 클래스 위에 @Table(name = "USER") 적어준다.
컬럼 또한 마찬가지로 매핑해준다.
EntityManager가 내부적으로 데이터커넥션을 물고 동작한다.
따라서 사용 다 하고 나면 꼭 닫아주어야.
전체 애플리케이션이 끝나면 EntityManagerFactory까지 닫아준다.
EntityManager는 데이터베이스 하나당 묶여서 돌아감.
설정파일의 설정정보 읽어와서 만듦
EntityManager를 자바 컬렉션으로 이해한다.
내 객체를 대신 저장해주는 녀석이라 생각하자.
자바 객체에서 값만 바꿨는데 이게 어떻게 되지?
JPA를 통해서 엔티티를 가져오면 얘는 이제 JPA가 관리를 한다.
그리고 JPA가 변경이 됐는지 안됐는지 트랜잭션을 커밋하는 시점에 다 체크한다.
뭔가 바뀌었네? 하면 트랜잭션 커밋하기 직전에 업데이트 쿼리를 날린다.
웹서버가 올라오는 시점에, emf와 db는 딱 하나만 생성이된다.
고객의 요청이 올때마다 계속 EntityManager em은 썼다가 버렸다가 이렇게 동작함.
rdb는 데이터변경 자체를 트랜잭션 안에서 하도록 설계가 되어있다.
select m from Member as m
에서 m은 Member Entity를 선택한 거라고 보면 됨.
JPQL을 실행하면, 방언과 합쳐져서 현재 데이터베이스에 맞는 적절한 sql이 나간다.