테이블
과 엔티티
를 매핑하고. 이 엔티티를 저장, 수정, 삭제 조회하는 일을 한다. (출처 : 자바 ORM 표준 JPA 프로그래밍 - 김영한)
엔티티 매니저
를 만들기 위해 DB당 하나씩
사용엔티티 매니저 팩토리 설정
을 한다.<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="이름 설정">
<properties>
<!-- jdbc driver -->
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<!-- 접근하려는 계정이나 DB-->
<property name="javax.persistence.jdbc.user" value="계정명이나 DB명 입력"/>
<!-- 접근하려는 계정의 비밀번호 -->
<property name="javax.persistence.jdbc.password" value="비밀번호 입력"/>
<!-- DB의 url -->
<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>
<!-- DB별 방언 -->
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
</properties>
</persistence-unit>
</persistence>
hibernate.dialect(방언)은 DBMS별(오라클, MySQL, ...)별 그에 맞는 적절한 SQL문 등을 날릴 수 있도록 하는 설정이다.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistenc-unit 이름");
emf.close();
엔티티 매니저는 테이블과 매핑되어있는 엔티티를 관리(저장, 수정, 삭제, 조회)를 하는 역할을 한다.
엔티티 매니저 생성
EntityManager em = emf.createEntityManager();
em.close();
EntityTransaction tx = em.getTransaction();
tx.begin();
//하나의 트랜잭션 단위의 작업들...
tx.commit();
(출처 : 자바 ORM 표준 JPA 프로그래밍 - 김영한)
Member member = new Member();
member.setName("두부쿠키");
em.persist(member);
em.find(Member.class, 1L);
.persist()
) 조회한(.find()
) 엔티티1차 캐시에 저장
된다.em.detach(member);
em.clear();
em.close(); // 엔티티 매니저를 닫아도 모두 준영속 상태가 된다.(당연히)
em.remove(member);
em.persist(member1);
1차 캐시 | |
---|---|
ID | Entity |
1L | Member1 |
em.find(Member.class, 2L);
1차 캐시 | |
---|---|
ID | Entity |
1L | Member1 |
2L | Member2 |
em.find(Member.class, 1L);
이미 1차 캐시에 있는 엔티티를 조회하게 되면 SELECT문을 따로 날리지 않고 1차 캐시에서 엔티티를 가져온다.
따라서, 동일한 영속성 컨텍스트 안에서 같은 ID
를 갖는 엔티티는 동일한 객체
이다.
Member memberA = em.find(Member.class, 1L);
Member memberB = em.find(Member.class, 2L);
System.out.print(memberA==memberB); //true
INSERT문
을 그 동시에 날리는 것은 아니다.tx.commit();
쓰기 지연 SQL 저장소
에 INSERT문이 저장된다.UPDATE문
이 날라간다.1차 캐시 | ||
---|---|---|
ID | Entity | 스냅샷 |
1L | Member1 | Member1 스냅샷 |
2L | Member2 | Member2 스냅샷 |
쓰기 지연 SQL 저장소
에 저장하고,쓰기 지연 SQL 저장소
에 저장된 쿼리(등록, 수정, 삭제)를 DB에 전송하는 작업em.flush();
tx.commit();
em.createQuery("select ... from ...", Member.class);
쓰기 지연 SQL 저장소
와 관련된 것이지, 영속성 컨텍스트를 비우지는 않는다.