카테고리 없음
No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call; nested exception is javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - c..
티에리앙리
2022. 7. 9. 13:12
JPA 관련 학습 도중에 테스트 코드를 작성하는데 다음과 같은 에러가 발생했다.
org.springframework.dao.InvalidDataAccessApiUsageException: No EntityManager with actual
transaction available for current thread - cannot reliably process 'persist' call;
nested exception is javax.persistence.TransactionRequiredException:
No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call
내용은 현재 스레드에 트랜잭션을 사용할 수 있는 EntityManager가 없어서 persist 할 수 없다는 내용이다.
그래서 @Test에
@Transactional 어노테이션이 없어서 추가해줬다.
당연한 사실 너무나도 당연하지만 그래도 기록으로 남겨둔다.
@Test
@Transactional // Transactional 어노테이션 추가 - Spring Annotaion 을 import함
public void testMember() throws Exception{
// given
Member member = new Member();
member.setUsername("memberA");
// when
Long saveId = memberRepository.save(member);
Member findMember = memberRepository.find(saveId);
// then
Assertions.assertThat(findMember.getId()).isEqualTo(member.getId());
Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
}
JPA는 transaction 기반으로 작성하기 때문에
transaction 단위에 따라 1차 캐시 영역에 있는 객체들이 db에 flush 되어 영속화 되기 때문이다.
하지만 그러한 영속작업을 하는 persist() 메서드에 객체가 들어갔으나 가능한 transaction이 존재하지 않았기에 위와 같은 에러가 발생한 것이다.
그러므로 @Transactional을 선언하자