같은 트랙잭션 내에서 save
를 통해 엔터티 업데이트를 실행한 후 findById
, findAll
메소드를 실행해봤다.
findById()
시 update 쿼리 안 나감findById
를 통해 엔터티를 찾았을 때는 update, select 다 발생하지 않았다.
findAll()
메소드 실행 시 update 쿼리 후 select 쿼리 날라감findAll
을 통해 엔터티를 찾았을 때는 update 쿼리 발행 후 select 쿼리가 발생했다.
findAll
메소드는 엔터티매니저가 아닌 DB에 직접 요청하기 때문에 동기화를 위해 flush를 실행 한다.
Critieria
를 통해 findAll 메소드는 JPQL로 만들어진다.
@BeforeEach
void 데이터준비() {
String title = "junit5";
String author = "메타코딩";
Book book = Book.builder()
.title(title)
.author(author)
.build();
bookRepository.save(book);
}
@Test
public void 책수정_test() {
// given
Long id = 1L;
String title = "junit";
String author = "데어코딩";
Book updatebook = new Book(id, "junit", "데어코딩");
// update
Book bookPS = bookRepository.save(updatebook);
// update 쿼리 x
bookRepository.findById(bookPS.getId());
// update 쿼리 후 select
bookRepository.findAll()
.stream()
.forEach((b) -> {
System.out.println("2.==============");
System.out.println(b.getId());
System.out.println(b.getTitle());
System.out.println(b.getAuthor());
});
// then
assertEquals(id, bookPS.getId());
assertEquals(title, bookPS.getTitle());
assertEquals(author, bookPS.getAuthor());
}