• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

준영속상태의 초기화

21.02.17 22:04 작성 조회수 113

1

선생님  준영속상태의 초기화를 하실때(37분 20초에서 )

Member refMember = em.getReference(Member.class, member1.getId());

를 해주셨는데 getReference도 find와 같이  문장이 실행되는 순간 영속성컨텍스트에프록시 객체를 올린다음에 초기화시 컨텍스트에서 엔티티를 뒤지고 없으면 db로 가서 끌고온다음에 또 영속성컨텍스트에 올려서 확인을 하는게 맞는지요?

이게맞다면 member1은 em.flush와 em.clear를 통해 영속성컨텍스트에는 존재하지 않으며 db에는 올라가있고 -> getReference코드를 실행시켜서 일단 초기화되지 않는 프록시 객체를 만들었고요 -> detach를 통해서 refmember를 준영속 상태를 만들어주었습니다.

영속성컨텍스트에는 제가 생각할땐 아무것도 없는 상태인데 detach가 왜가능한건가요? 프록시객체가 초기화되어서 엔티티를 만들어낸 것도 아니고 초기화되기전 프록시객체 자체도 영속성컨텍스트에 올라가있는건가요? em.persist(refMember)을 써준것도아니고 ... 프록시객체도 엔티티라고 치고 올린다음에 그안에 참조값을 실제 엔티티생성과 동시에 채워주는건가요?

그리고 두번째로 refmember 자체가 초기화되기전에 만약 team테이블과 연관이 있으면 refmember을 초기화하는순간 member와 team까지 다불러오는건가요? 이건 fetch 속성과 관련이 없는건가요?

이쯤오니 너무 헷갈립니다ㅜㅜ 제 질문을 이해하셨을지 모르겠습니다... 지저분한글 읽어주셔서 감사합니다 선생님 항상 감사합니다.

답변 2

·

답변을 작성해보세요.

1

감사합니다!!!! 확인했습니다!!

1

안녕하세요. 규영님

첫번째 질문의 답은

em.getReference()를 호출하는 순간 DB와 무관하게 영속성 컨텍스트에 일단 프록시 객체가 올라갑니다. PK가 있기 때문에 영속성 컨텍스트에 KEY는 PK이고, 값이 프록시 객체가 들어있다고 이해하시면 됩니다.

두번째 질문의 답은

제가 답을 직접 드리는 것도 좋지만, 직접 한번 테스트 해보시고, 정리해서 남겨주시면 좋겠습니다. 그래야 더 많이 배울 수 있으니까요^^

감사합니다.