• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

jpa 영속성 컨텍스트 질문입니다.

23.05.29 18:51 작성 조회수 249

1

em.persist(member1);
em.persist(order1);
em.persist(order2);
em.flush();
em.clear();
<-- order1 내용 변경 -->
em.persist(order1);
tx.commit()

flush와 clear까지 하면 db에 반영은 되어있고 order1의 내용을 조금 바꾼뒤 persist하면 1차 캐시에 올라가있을텐데, commit을 하면 실제 db에 아무것도 뜨지 않습니다.

em.clear 주석 하고, 내용 변경 후 em.persist의 유무와 상관없이 db에 잘 반영이 됩니다.

clear와 persist 사이의 무슨 관계가 있는 것 같은데, db에 아무것도 뜨지 않는 이유가 뭔가요?

 

답변 1

답변을 작성해보세요.

1

y2gcoder님의 프로필

y2gcoder

2023.05.29

안녕하세요, 송민석 님. 공식 서포터즈 y2gcoder 입니다.

괜찮으시다면 혹시 테스트한 코드의 전체를 올려주실 수 있으시겠습니까? 강의와 똑같이 메인 코드에다 테스트 코드를 작성하셨다면 try catch 문을 포함해서 올려주시면 답변을 드리는데 큰 도움이 될 것 같습니다!


감사합니다.

송민석님의 프로필

송민석

질문자

2023.05.30

package jpabook.jpashop;

import jpabook.jpashop.domain.Member;
import jpabook.jpashop.domain.Order;
import jpabook.jpashop.domain.OrderStatus;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class JpaMain {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        EntityManager em = emf.createEntityManager();

        EntityTransaction tx = em.getTransaction();
        tx.begin();
        try {
            Member member1 = new Member();
            member1.setName("song");
            em.persist(member1);

            Order order1 = new Order();
            order1.setMember(member1);
            em.persist(order1);

            Order order2 = new Order();
            order2.setMember(member1);
            em.persist(order2);

            em.flush();
            em.clear();
//
            order1.setStatus(OrderStatus.ORDER);
//
            System.out.println("========================================");
            em.persist(order1);
            tx.commit();


        }
        catch (Exception e) {
            tx.rollback();
        } finally {
            em.close();
        }

        emf.close();
    }
}

 

테스트 코드 입니다.

y2gcoder님의 프로필

y2gcoder

2023.05.30

전체 코드를 올려주셔서 감사합니다. 전체 코드를 보고 조심스럽게 추측해본 바로는 em.clear() 후에 식별자를 가지게 된 준영속 객체를 persist 하는 과정에서 예외가 발생할 것으로 추측합니다.
다만 catch 문에서 exception에 대한 로깅 없이 롤백을 해주고 있기 때문에 db에 아무것도 뜨지 않은 것으로 보입니다.

catch (Exception e) {
  e.printStackTrace(); // 해당 부분을 추가해주십시오!
  tx.rollback();
}

이렇게 추가해주시고 실행해주시면 아마도 PersistencException 에 대한 트레이스가 보일 것이라 생각합니다!

예상대로 예외가 발생하여 롤백된 것이라면! 해당 링크(클릭) 을 참고해주십시오 :)