- JPA 를 이해하는데 가장 중요한 용어
- "엔티티를 영구 저장하는 환경" 이라는 뜻
- EntityManger.persist(entity)
엔티티의 생명주기
- 비영속
- 객체를 생성한 상태
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Member member = new Member();
member.setId("memberA");
member.setName("soycrab");
//객체를 저장한 상태(영속성 Context에 저장)
em.persist(member);
//해당 명령어를 실행해야 DB에 저장 그전까지는 영속성 Context에 저장되어 있음
tx.commit();
- 영속
영속성 컨텍스트의 이점
- 1차 캐시 동일성(identity) 보장
- 트랜잭션을 지원하는 쓰기 지연 (transactional write-behind)
- 변경 감지(Dirty Checking)
- 지연 로딩(Lazy Loading)
03. 영속성 관리
엔티티 조회, 1차 캐시
1차 캐시에서 조회
데이터 베이스에서 조회
1차 캐시로 반복 가능한 읽기(REPEATABLE READ) 등급의 트랜잭 션 격리 수준을 데이터베이스가 아닌 애플리케이션 차원에서 제공
Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");
System.out.println(a == b); //동일성 비교 true
트랜잭션을 지원하는 쓰기 지연
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
//엔티티 매니저는 데이터 변경시 트랜잭션을 시작해야 한다.
transaction.begin(); // [트랜잭션] 시작
em.persist(memberA);
em.persist(memberB);
//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
//커밋하는 순간 데이터베이스에 INSERT SQL을 보낸다.
transaction.commit(); // [트랜잭션] 커밋
엔티티 삭제
//삭제 대상 엔티티 조회
Member memberA = em.find(Member.class, “memberA");
em.remove(memberA); //엔티티 삭제
플러시
- 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영
플러시 발생
- 변경 감시
- 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
- 쓰기 지연 SQL 저장소의 쿼리를 데이터 베이스에 전송 (등록, 수정, 삭제 쿼리)
영속성 컨테스트를 플러시 하는 방법
- em.flush() 직접호출
- 트랜잭션 커밋 플러시 자동호출
- JPQL 쿼리 실행 플러시 자동 호출
플러시는?
-영속성 컨텍스트를 비우지 않음
- 영속성 컨텐스트의 변경내용을 데이터베이스에 동기화
-트랜잭션이라는 작업 단위가 중요 -> 커밋 직전에만 동기화하면됨
김영한 선생님 강의 내용 복습을 위해 정리한 메모에요.
'공부방 > JPA' 카테고리의 다른 글
고급 매핑 (0) | 2023.03.04 |
---|---|
다양한 연관관계 매핑 (0) | 2023.02.22 |
연관관계 매핑 기초 (0) | 2023.02.19 |
엔티티 매핑 (0) | 2023.02.18 |
준영속 상태 (0) | 2023.02.13 |
행복한 코딩을 위하여!
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!