JpaRepository의 save()는 단순한 새 엔티티를 추가하는 메소드가 아닙니다.
@RunWith(SpringRunner.class)
@DataJpaTest
public class PostRepositoryTest {
@Autowired
private PostRepository postRepository;
@PersistenceContext
private EntityManager entityManager;
@Test
public void crud() {
Post post = new Post();
post.setTitle("jpa");
Post savedPost = postRepository.save(post); // insert / persist
assertThat(entityManager.contains(post)).isTrue();
assertThat(entityManager.contains(savedPost)).isTrue();
assertThat(post == savedPost).isTrue();
Post postUpdate = new Post();
postUpdate.setId(post.getId());
postUpdate.setTitle("hibernate");
Post updatedPost = postRepository.save(postUpdate); // update / merge
assertThat(entityManager.contains(updatedPost)).isTrue();
assertThat(entityManager.contains(postUpdate)).isFalse();
assertThat(updatedPost == postUpdate).isFalse();
List<Post> all = postRepository.findAll();
assertThat(all.size()).isEqualTo(1);
}
}
save의 리턴된 객체는 영속화 된 객체이다. (persist 된)
merge 상태에서도 리턴된 객체가 영속화 된 객체이다.
best practice는 항상 return을 받아 사용해라.
persist 상태의 객체는 변화를 jpa가 추적한다.
데이터를 가져오려고 하네? 얼른 싱크해야 겠다. 반영하고 셀렉트 해야지
@RunWith(SpringRunner.class)
@DataJpaTest
public class PostRepositoryTest {
@Autowired
private PostRepository postRepository;
@PersistenceContext
private EntityManager entityManager;
@Test
public void crud() {
Post post = new Post();
post.setTitle("jpa");
Post savedPost = postRepository.save(post); // insert / persist
Post postUpdate = new Post();
postUpdate.setId(post.getId());
postUpdate.setTitle("hibernate");
Post updatedPost = postRepository.save(postUpdate); // update / merge
updatedPost.setTitle("cmlee");
List<Post> all = postRepository.findAll();
assertThat(all.size()).isEqualTo(1);
}
}
Transient인지 Detached인지 어떻게 판단하는가?