아카이브

[스프링 데이터 JPA] 스프링 데이터 JPA 6. Update 쿼리 본문

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");

    }