
* 겪고 있는 문제 상황을 최대한 자세하게 작성해주세요.
* 문제 해결을 위해 어떤 시도를 해보았는지 구체적으로 함께 알려주세요.
강사님 merge 저장 테스트 단계에서 궁금한 게 생겨서 질문드립니다!
일단 코드로 표현해드리면
Memo memo = new Memo();
memo.setId(3L);
memo.setUsername("merge()");
memo.setContents("merge() 저장");
System.out.println("merge() 호출");
Memo mergedMemo = em.merge(memo);
System.out.println("em.contains(memo) = " + em.contains(memo));
System.out.println("em.contains(mergedMemo) = " + em.contains(mergedMemo));
System.out.println("트랜잭션 commit 전");
et.commit();
System.out.println("트랜잭션 commit 후");
이 코드에서 3번 아이디를 가지는 비영속 컨텍스트 메모를 생성한 후에 3번 아이디에 해당하는 데이터가 1차 캐시에 있는지 확인을 합니다. 없으면 데이터베이스에 있는지 확인을 하고 둘 다 없으니까 액션 큐에 인서트로 3번 아이디를 가지는 메모를 생성합니다. 여기까지 맞나요?
일단 그 후에 memo 객체를 인자로 전달받아 mergedMemo 객체에 저장을 했기 때문에 영속성 컨테스트에 memo로 저장되지 않고 mergedMemo로 저장되는 거구요. (true, false가 출력되는 이유)
그런데 이때 영속성 컨테스트에 저장이 되는 타이밍이 액션 큐에 인서트 됐을 때부터 저장이 되는 건가요, 아니면 et.commit();이 호출되고 나서부터 저장이
되는 건가요???
조금 헷갈리는 부분이 있어 질문드립니다 ㅎㅎ 틀린 부분이 있다면 수정 부탁드립니다!
