게시글
질문&답변
2020.02.08
중첩된 fetch join
Spring data jpa에서 @EntityGraph 를 통해서도 하나이상의 하위레벨의 fetch join이 가능한가요 ?
- 0
- 4
- 455
질문&답변
2020.02.07
중첩된 fetch join
감사합니다.
- 0
- 4
- 455
질문&답변
2020.02.07
@Transactional관련 질문 입니다.
확인되었습니다. 감사합니다.
- 1
- 4
- 1.2K
질문&답변
2020.02.06
@Transactional관련 질문 입니다.
답변 감사합니다. 우선 class에서 @Transactional을 제거하고 Method에서도 @Transactional이 없으면 em.flush가 있는곳에서 하기와 같은 예외를 발생시킵니다. 이것은 Transaction 밖에서 em.flush를 사용하면 안된다는 의미로 생각됩니다. javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'flush' call 질문1를 확인하기 위해 우선 em.flush를 모두 삭제하고 확인을 해보니 A, B의 동작이 같았는데 makelist()에서 saveAll을 하고 db에서 값을 확인할수 있었는데 이는 saveAll 구현체에서 @Transactional을 사용해서 save 가 완료되면 트랜잭션이 종료되어 commit이 되었기 때문인것 같은데 문제는 test1에 @Transactional이 붙어 있으나 없으나 save가 되는 순간 값이 업데이트 됨을 확인하였습니다. 제가 잘 이해가 안되는게 test1 메소드에 @Transactional을 붙이면 메소드가 실행되는 순간 트랜잭션이 걸리고 메소드가 종료되는 순간 커밋이 이루어져서 db에 반영되어야 할것 같은데 트랜잭션이 안걸리고 있습니다. (save를 빼도 변경감지로 db가 자동으로 업데이트 되지도 않습니다. ) package study.querydsl.repository;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.annotation.Rollback;import org.springframework.transaction.annotation.Transactional;import study.querydsl.entity.Member;import java.util.ArrayList;import java.util.List;@SpringBootTest@Rollback(false)class MemberRepositoryTest {// @PersistenceContext// private EntityManager em; @Autowired private MemberRepository memberRepository; @Test public void test() throws InterruptedException { List members = makeList(); for (Member member : members) { test1(member.getId()); Thread.sleep(1000); } } private List makeList() throws InterruptedException { List members = new ArrayList(); for (int i = 0 ; i 20 ; i++) { Member member = new Member("gon " + i, i); members.add(member); } memberRepository.saveAll(members); Thread.sleep(5000); return members; } @Transactional protected void test1(Long id) { Member member = memberRepository.findById(id).get(); member.setUsername("Park"); memberRepository.save(member); System.out.println("temp"); }} 왜 그런건가요 ㅠ
- 1
- 4
- 1.2K