티스토리 뷰
플러시
- 영속성 컨텍스트의 변경내용을 데이터베이스에 반영
플러시 발생
- 변경 감지
- 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
- 쓰기지연SQL저장소의 쿼리를 데이터베이스에 전송(등록,수정,삭제 쿼리)
영속성 컨텍스트를 플러시 하는 방법
- em.flush() 직접호출
- 트랜잭션 커밋 - 플러시 자동 호출
- JPQL 쿼리 실행 - 플러시 자동 호출
만약 아래와 같이 flust()를 직접 호출할 경우
Member member = new Member(200L, "member200");
entityManager.persist(member);
entityManager.flush();//즉시 디비에 쿼리를 날린다.
System.out.println("======");
ts.commit();
Hibernate:
/* insert helloJpa.Member
*/ insert
into
member
(name, id)
values
(?, ?)
======
이와 같은 오류가 된다. flush() 시점에서 쿼리가 날라간다.
주의점으로는 1차캐시에서 지워지진 않으니 쿼리를 날리는 것으로 동작이 끝났다고 생각하지 않는 것을 주의해야한다. (1차 캐시는 하나의 요청에서는 계속 유지된다.)
여기서 주의해야 할 것이 또 있다.
JPQL쿼리를 실행 할 때에 자동으로 flush()가 호출 된다.
em.persist(memberA);
em.persist(memberB);
//중간에 JPQL 실행
query = em.createQuery("select m from Member m", Member.class);
List<Member> members = query.getResultList();
위와 같은 코드일 경우 persist는 1차캐시에만 존재하게 된다. 만약 flush가 안된 경우 JPQL로 호출하면 db에 데이터가 없으므로 조회 할때에 문제가 생긴다. 그래서 JPQL을 날리면 그 전에 flush가 된 후 변경 혹은 추가 된 데이터 상태에서 불러오게 된다.
정 원한다면 이렇게 FlushModeType을 이용해서 바꿀 수 있지만 보통 기본값으로만 사용한다.
플러시
- 영속성 컨텍스트를 비우지 않음
- 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화
- 트랜잭션이라는 작업 단위가 중요 -> 커밋 직전에만 동기화함녀 됨
'dev_공부일지 > spring JPA 활용 웹만들기' 카테고리의 다른 글
엔티티 매핑 (0) | 2024.01.31 |
---|---|
준영속 상태 (0) | 2024.01.30 |
쓰기지연 SQL 저장소 (1) | 2024.01.30 |
jpa에서 중요한 2가지 -엔티티 매니저 팩토리와 엔티티 매니저 (0) | 2024.01.30 |
엔티티의 생명주기 (0) | 2024.01.30 |
- Total
- Today
- Yesterday
- 컨트
- rejectValue
- 항해플러스
- thymleaf
- 향해플러스백엔드
- 향해플러스
- filter
- 인터셉터
- reject
- HTTP
- react실행
- BindingResult
- 백엔드 개발자 공부
- ArgumentResolver
- 로그인
- Java
- exception
- React
- 스프링공부
- 리터럴
- JPA
- 항해99
- 백엔드 개발자 역량
- 스프링부트
- 예외처리
- SpringBoot
- hypertexttransferprotocol
- 향해99
- jpa api
- Intercepter
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |