persist()
메서드는 엔티티 매니저를 사용해서 회원 엔티티를 영속성 컨텍스트에 저장한다.persist()
메서드를 사용하는 순간에 DB에 저장되는 것이 아니고 이 persist()
메서드를 사용하는 순간 영속성 컨텍스트에서 관리되는 대상이 되는 것이다.public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction ta = em.getTransaction();
ta.begin();
try {
// ✔️처음 조회할 때 DB에서 해당 엔티티를 찾아서 1차 캐시에 저장하므로 SELECT 쿼리가 한 번 호출됨
Member findMember1 = em.find(Member.class, 100L);
// ✔️1차 캐시에 있기 때문에 DB에서 찾을 필요없이 1차 캐시에서 찾으면 됨
Member findMember2 = em.find(Member.class, 100L);
ta.commit();
} catch (Exception e) {
ta.rollback();
} finally {
em.close();
}
emf.close();
}
}
실행 결과
Hibernate:
select
m1_0.id,
m1_0.name
from
Member m1_0
where
m1_0.id=?
equals()
메서드를 구현해야 한다.update()
메서드를 실행하지않아도 이것이 가능한데 이렇게 엔티티 변경사항을 데이터베이스에 자동으로 반영하는 기능을 변경 감지라고 한다.정의 : 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 것
INSERT
쿼리가 날아갔다. Member 객체를 영속성 컨텍스트에 보관하고 쓰기 지연 SQL 저장소에 1건이 저장되는데 그 다음 바로 flush()
메서드를 호출해서 데이터베이스에 바로 반영을 한 것이다.flush()
메서드를 호출한다고 해서 1차 캐시에 있는 내용들이 삭제되는 것이 아니다.public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction ta = em.getTransaction();
ta.begin();
try{
Member member = new Member(200L, "member200");
em.persist(member);
em.flush();
System.out.println("======================");
ta.commit();
} catch (Exception e) {
ta.rollback();
} finally {
em.close();
}
emf.close();
}
}
실행 결과
Hibernate:
/* insert for
org.example.Member */insert
into
Member (name, id)
values
(?, ?)
======================
persist()
)에서 JPQL을 실행하면 JPQL이 SQL로 변환되어 데이터베이스에 엔티티를 조회한다. 하지만 데이터베이스에 반영하지 않으면 쿼리 결과로 조회되는 결과가 없게 된다. 쿼리를 실행하기 전에 영속성 컨텍스트를 플러시해서 변경 내용을 데이터베이스에 반영해야 한다. JPA는 JPQL을 실행할 때도 플러시를 자동으로 호출한다.em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
query = em.createQuery("select m from Member m", Member.class);
List<Member> members = query.getResultList();
em.detach()
: 특정 엔티티만 준영속 상태로 전환em.clear()
: 영속성 컨텍스트 완전히 초기화em.close()
: 영속성 컨텍스트 종료