강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

YOGURT님의 프로필 이미지
YOGURT

작성한 질문수

JPA에서 하나의 트랜잭션안에서 많은 EntityManager

작성

·

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의 기사를 참고하시기 바랍니다. 추가로 궁금한 사항이 있으면 댓글로 알려주세요. 감사합니다~

YOGURT님의 프로필 이미지
YOGURT

작성한 질문수

질문하기