Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- QueryDSL
- 그리디
- Proxy
- db
- Exception
- 자바
- spring
- 스프링 핵심 원리
- Servlet
- SpringBoot
- JPQL
- Greedy
- Android
- 김영한
- java
- JDBC
- Thymeleaf
- pointcut
- 알고리즘
- 스프링 핵심 기능
- 인프런
- transaction
- 백준
- kotlin
- Spring Boot
- 스프링
- AOP
- http
- springdatajpa
- jpa
Archives
- Today
- Total
개발자되기 프로젝트
플러시, 준영속 상태, 정리 본문
1. 플러시
- 영속성 컨텍스트의 변경 내용을 DB에 반영
- tx.commit() 실행되면 내부적으로 flush()실행됨.
- flush() 호출되면?? 무슨일이?
- 변경감지, dirty checking
- 수정된 엔티티 관련된 SQL을 생성하여 쓰기 지연 SQL저장소에 등록
- 쓰기지연 SQL 저장소의 쿼리를 DB에 전송(등록, 수정, 삭제) - 영속성 컨텍스트를 flush하는 방법
- em.flush() 직접하든가
- tx.commit() 호출하면 flush() 자동으로 호출 됨.
- JPQL 쿼리 실행하면 flush 자동 호출.
만약 persist(entity)하고 바로 JPQL을 통해 모든 엔티티 조회하면 DB에 반영이 안되어있기 때문에 불러올 수 없다.
따라서 JPA는 JPQL실행시 flush가 자동으로 호출해서 문제가 없도록 지원함. - 해보자.
Member member = new Member(500L, "member500");
em.persist(member);
em.flush();
System.out.println("=====================");
tx.commit(); //commit하는 시점에 쿼리 날라감.
- commit전에 flush로 인해 쿼리가 날라갔다!
Hibernate:
/* insert hellojpa.Member
*/ insert
into
Member
(name, id)
values
(?, ?)
=====================
22:41:21.107 [main] DEBUG org
- flush는 단지 쓰지지연 SQL 저장소에 있는 쿼리를 반영하는 것.
- 1차캐시는 안없어짐 ㅋㅋㅋ
- FlushModeType. --> 가급적 손대지ㅣ..말자..
- AUTO : 커밋이나 쿼리를 실행할 대 플러시(기본)
- COMMIT : commit()할 때 만 플러시. - 플러시는!
- 영속성 컨텍스트를 비우지 않음, 1차 캐시를 비우지 않음
- 쓰기 지연 SQL저장소에 모인 SQL을 DB로 밀어냄
- 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화
- Transaction이라는 작업 단위가 중요 -> commit 직전에만 동기화 하면 됨~~~
2. 준영속 상태(detached)
- 영속 -> 준영속
- 1차 캐시에 올라간 상태가 영속상태
- 영속 상태의 entity가 영속성 컨텍스트에서 분리(detatched)
- 영속성 컨텍스트가 제공하는 기능 사용 못함(dirty checking)
- 준영속 상태로 만드는 방법
- em.detatch(entity) : 특정 엔티티만 준영속 상태로 전환
- em.clear : 영속성 컨텍스트초기화 --> 관리 대상을 없애버림
- em.close : 영속성 컨텍스트 종료 --> 관리 주체를 없애버림 ㅋㅋㅋ - 해보자.
//em.find를 통해 가져온 member는 영속상태 Member member = em.find(Member.class, 500L); member.setName("wow"); //준영속 상태로 바꿈 em.detach(member); //commit 할 때 member의 업데이트 반영 안됨. tx.commit();
- select 쿼리만 돌아가고 update 쿼리는 안돌아간다.
- 영속상태인 member의 name을 변경했지만.
- 준영속 상태로 변경했기 때문에. member는 영속성 컨텍스트에서 관리하지 않는다.
- 따라서 commit 시점에 dirty checking의 대상이 아님.
- 그러므로 update 쿼리 실행 안됨.
Hibernate:
select
member0_.id as id1_0_0_,
member0_.name as name2_0_0_
from
Member member0_
where
member0_.id=?
3. GitHub : 210808 Persistence Context
'인프런 > [인프런] 자바ORM 표준 JPA 프로그래밍' 카테고리의 다른 글
데이터베이스 스키마 자동 생성, DDL 주의사항 (0) | 2021.08.09 |
---|---|
객체와 테이블 매핑 (0) | 2021.08.08 |
영속성 컨텍스트 2 (0) | 2021.08.08 |
영속성 컨텍스트 (0) | 2021.08.08 |
Hello JPA (0) | 2021.08.08 |
Comments