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