강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

opix0306님의 프로필 이미지
opix0306

작성한 질문수

flush() 관련 질문

작성

·

49

0

안녕하세요 !

for문 마지막 값에 대해 dirtyChecking이 이루어지지 않는 문제에 대해서 혹시 아시나요??

1. 특정값을 사용해서 entity의 list를 조회 -> 결과: [e1,e2,e3, …]

2. list를 순회하여 다른 entity 조회후 수정 -> 코드:

 

for (Entity entity : entityList ) {

1.OtherEntity oe = oeRepository.findByEntity(entity);

2. oe.update();

}

여기서 문제가 발생하는게 2.oe.update(); List의 가장 마지막 entity에 대해서는 업데이트 쿼리가 안날라갑니다.

조회는 모두 잘되는데 마지막 요소에 업데이트만 이루어지지 않습니다. 강제로 flush()를 호출했을때는 정상적으로 쿼리가 날아갑니다. 근데 플러쉬가 트랜잭션 커밋할때 이루어지는 것으로 알고 있어서 강제로 호출을 하지않아도 쿼리가 날아가야된다고 생각해서 이유를 모르겠네요

 

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. opix0306님.

말씀하신 상황에서 flush()가 호출되지 않아 마지막 Entity에 대한 업데이트가 수행되지 않는 문제는, JPA의 flush 메커니즘과 관련이 있을 수 있습니다. 기본적으로 JPA는 엔티티의 변경 사항을 캐시에 저장하고 있다가 트랜잭션이 커밋될 때 한꺼번에 데이터베이스에 반영합니다. 하지만 특정 상황에서는 ‘자동’으로 반영되지 않을 수 있습니다.

flush()가 명시적으로 호출되지 않은 이유로는 다음과 같은 점들이 있을 수 있습니다:

  1. Flush 모드 설정: Hibernate의 경우, 기본적으로 AUTO 모드로 설정되어 있습니다. 이 모드에서는 쿼리가 실행될 때, 변경된 데이터가 데이터베이스에 반영되지 않을 수 있습니다. 마지막 엔티티의 변경 사항이 반영되지 않는 것은 이와 관련이 있을 수 있습니다.

  2. 버그 또는 다르게 동작하는 코드: oe.update() 메서드 내에서 데이터 변경 로직이 올바르게 이루어지지 않는 경우, 즉 엔티티의 변경이 감지되지 않는 경우 문제의 원인이 될 수 있습니다.

  3. 트랜잭션 범위: 트랜잭션이 제대로 설정되지 않았다면, 일부 업데이트가 반영되지 않을 가능성도 있습니다. @Transactional 어노테이션을 사용하여 명시적으로 트랜잭션 범위를 지정하는 것도 방법입니다.

강제로 flush()를 호출했을 때 문제가 해결된다면, 특정 메서드 내에서 변경 사항이 flush되지 않도록 설정되어 있을 가능성이 있습니다. 트랜잭션 설정(@Transactional)과 Hibernate의 Flush 모드 옵션을 확인해보시기 바랍니다.

추가 설명이 필요하시다면, 추가적으로 트랜잭션 설정이나 EntityManager의 설정에 대해서도 질문 주시면 도움을 드리겠습니다.

도움이 되셨기를 바랍니다.

관련 정보:
- Transactional query methods

opix0306님의 프로필 이미지
opix0306

작성한 질문수

질문하기