실습 코드는 Github에!
엔티티매니저 팩토리에서 요청이 들어올 때마다 엔티티 매니저를 각각 만들어내고, 만들어진 엔티티 매니저들은 내부적으로 데이터베이스 커넥션을 이용하여 DB를 사용함
EntityManager.persist(entity)
: 엔티티 매니저를 사용하여 엔티티를 영속화한다 즉, 엔티티를 영속성 컨텍스트에 저장함영속성 컨텍스트는 논리적인 개념으로, 눈에 보이지 않음. 엔티티 매니저를 통해서 영속성 컨텍스트에 접근할 수 있음
➡️ 엔티티 매니저 속에 (눈에 보이지 않는) 영속정 컨텍스트가 생성됨
새로운
상태관리
되는 상태분리
된 상태삭제
된 상태// 객체를 생성한 상태
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
// 객체를 생성한 상태(비영속)
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
// 객체를 저장한 상태(영속)
em.persist(member);
System.out.println("BEFORE");
em.persist(member);
System.out.println("AFTER");
다음과 같이 코드를 작성해서 실행해본 결과, 아래와 같이 BEFORE과 AFTER 사이에 sql 쿼리문이 print되지 않았다.
tx.commit()
)영속 상태로 전환하기 위해서는 em.persist()
사용하면 되는데, 다른 한 가지 방법이 더 있음. 바로 1차 캐시에 없을 때 DB에서 찾아서 1차 캐시에 넣는 방법 (앞에서 정리했던)
detached(entity)
: 특정 엔티티만 준영속 상태로 전환em.clear()
: 영속성 컨텍스트를 완전히 초기화em.close()
: 영속성 컨텍스트를 종료em.find(Member.class, "member1")
을 통해 찾으면 db를 조회하는 것이 아니라 1차 캐시를 조회함db에는 존재하지만 1차 캐시에 존재하지 않는 데이터를 조회하면 터미널에 아래와 같은 select 쿼리가 입력된다.
Hibernate:
select
member0_.id as id1_0_0_,
member0_.name as name2_0_0_
from
Member member0_
where
member0_.id=?
true
값을 반환한다.1차 캐시 안에는 스냅샷이라는 컬럼이 존재한다. 엔티티가 최초로 영속성 컨텍스트에 저장될 때의 모습을 남겨놓은 것이라 생각하면 됨
em.flush
: 직접 호출 (직접 쓸 일은 거의 없지만, 테스트 할 때를 대비해 알아두기)FlushModeType.AUTO
: 커밋이나 쿼리를 실행할 때 플러시(기본값)FlushModeType.COMMIT
: 커밋할 때만 플러시