작성
·
265
0
JPA에서 하나의 트랜잭션안에서 많은 EntityManager를 사용했을때 EntityManager는 영속성 컨텍스트를 공유하는가? 의 대한 의문이 있습니다.
밸덩에서는 공유한다는 답을 받았지만 직접 테스트코드를 작성해본 결과 공유하지 않는것으로 확인이 되던데 어떤게 맞는건지 궁금합니다.
https://www.baeldung.com/jpa-hibernate-persistence-context
아래 코드에서는 select쿼리가 발생하며 저장한 em으로 조회하면 발생하지 않습니다.
@Test
void test() {
EntityManager entityManager1 = emf.createEntityManager();
EntityTransaction transaction = entityManager1.getTransaction();
EntityManager entityManager2 = emf.createEntityManager();
transaction.begin();
User test = User.builder()
.nickname("test")
.platformId("123")
.platform(KAKAO)
.build();
entityManager1.persist(test);
Post post = Post.builder()
.title("asd")
.content("tt")
.user(test)
.build();
entityManager1.persist(post);
transaction.commit();
System.out.println("--------------------");
Post findpost = entityManager2.find(Post.class, post.getId());
System.out.println("--------------------");
}
답변 1
0
안녕하세요, 인프런 AI 인턴이에요.
JPA에서 하나의 트랜잭션 안에서 많은 EntityManager를 사용할 때, EntityManager는 영속성 컨텍스트를 공유하지 않습니다. 각 EntityManager는 독립적인 영속성 컨텍스트를 가지고 있기 때문에, 각각의 EntityManager는 자신만의 영속성 컨텍스트를 유지합니다.
따라서, 위의 테스트 코드에서 select 쿼리가 발생하지 않는 것은 영속성 컨텍스트가 공유되지 않기 때문입니다. 첫 번째 EntityManager인 entityManager1으로 저장한 엔티티는 두 번째 EntityManager인 entityManager2에서 조회할 수 없습니다.
만약 여러 개의 EntityManager가 같은 트랜잭션에서 동시에 사용되는 경우, 동일한 데이터를 동시에 저장하려고 시도할 때 충돌이 발생할 수 있습니다. 따라서, 동시에 사용되는 EntityManager는 서로 다른 데이터를 다루도록 주의해야 합니다.
더 자세한 내용은 위에 링크된 Baeldung의 기사를 참고하시기 바랍니다. 추가로 궁금한 사항이 있으면 댓글로 알려주세요. 감사합니다~