Spring/스프링 데이터 JPA
[스프링 데이터 JPA] 스프링 데이터 JPA 6. Update 쿼리
주멘이
2021. 1. 16. 23:01
쿼리 생성하기
- find...
- count...
- delete...
- 흠.. update는 어떻게 하지?
Update 또는 Delete 쿼리 직접 정의하기
- @Modifying @Query (추천하지 않습니다)
@Modifying(clearAutomatically = true, flushAutomatically = true)
// flush -> update query -> PersistentContext를 clear -> DB에서 가져온다(context를 비워줘서 캐시에 없으니까)
@Query("UPDATE Post p Set p.title = ?1 WHERE p.id = ?2")
int updateTitle(String hibernate, Long id);
테스트 코드
/**
* 한 @Transactional 내에서는 Persistent 캐시가 유지된다
*/
@Test
@DisplayName("update title")
public void updateTitle() {
Post post = savePost(); // persistent 상태 (1차 캐시)
String changeTitle = "hibernate";
int update = postRepository.updateTitle(changeTitle, post.getId()); // DB에 update query가 발생했지만
assertThat(update).isEqualTo(1);
Optional<Post> byId = postRepository.findById(post.getId()); // post가 아직 1차 캐시 중이라 DB에 가지않고, 캐싱하고 있던 것을 참조한
assertThat(byId.get().getTitle()).isEqualTo(changeTitle);
}
@Test
@DisplayName("update title")
public void recommendUpdateTitle() {
Post spring = savePost();
spring.setTitle("hibernate");
// 명시적으로 update를 호출하진 않았지만
// find하기 전에 DB Sync를 해야하는 것을 hibernate가 알기에
// find 전에 변경해주면 DB에 Sync를 미리 맞춘 후 select 한다
List<Post> all = postRepository.findAll();
assertThat(all.get(0).getTitle()).isEqualTo("hibernate");
}