-
카테고리
-
세부 분야
백엔드
-
해결 여부
해결됨
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
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
2023.05.30
전체 코드를 올려주셔서 감사합니다. 전체 코드를 보고 조심스럽게 추측해본 바로는 em.clear() 후에 식별자를 가지게 된 준영속 객체를 persist 하는 과정에서 예외가 발생할 것으로 추측합니다.
다만 catch 문에서 exception에 대한 로깅 없이 롤백을 해주고 있기 때문에 db에 아무것도 뜨지 않은 것으로 보입니다.
catch (Exception e) {
e.printStackTrace(); // 해당 부분을 추가해주십시오!
tx.rollback();
}
이렇게 추가해주시고 실행해주시면 아마도 PersistencException 에 대한 트레이스가 보일 것이라 생각합니다!
예상대로 예외가 발생하여 롤백된 것이라면! 해당 링크(클릭) 을 참고해주십시오 :)
답변 1