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

Transient인지 Detached인지 어떻게 판단하는가?