인프런 커뮤니티 질문&답변

땅땅님의 프로필 이미지
땅땅

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

OneToOne 관계에서의 객체 생성

해결된 질문

작성

·

473

0

안녕하세요! Qeurydsl 강의 너무 잘 듣고있습니다~ 항상 감사합니다~

이번에 궁금한 점이 생겼는데 OneToOne 관계에서의 객체생성 입니다.

member 테이블과 member_detail이라는테이블이 존재하는데 이 때 member_detail 테이블에서 member 테이블의 id를 외래키로 가지고 있는 상태입니다.

이 때 엔티티 매핑을 아래와 같이 진행하였습니다.

그리고 아래 사진과 같이 테스트 두가지를 진행하였는데,

첫번째 테스트는 제가 원하는 데이터베이스 값대로 잘 들어가는 것을 확인하였습니다!

하지만 두번째 테스트는 제대로 동작하지 않고 

org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : study.datajpa.entity.Member.memberDetail -> study.datajpa.entity.MemberDetail; nested exception is java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : study.datajpa.entity.Member.memberDetail -> study.datajpa.entity.MemberDetail

다음과 같이 에러코드가 찍히는데 혹시 그 원인이 어떤 것일까요?

그리고 첫번째 테스트코드를 짜면서 든 의문이 주석의 질문인데 이 답변도 같이 해주신다면 정말 감사합니다~!
(질문 내용: save후 find가 동작할때 flush가 일어나지 않았는데 DB Qeury가 어째서 찍히는 것일까요..? )

답변 1

1

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요 요한님

우선 1번 질문먼저^^!

두번째 테스트에서 

MemberDetail memberDetail = new MemberDetail(...)

memberDetailRepository.save(memberDetail) -> 요 부분이 빠졌습니다^^!

JPA의 persist를 호출할 때, 해당 객체와 연관된 모든 객체도 영속 상태여야 합니다.

(object references an unsaved transient instance -> 이 오류메시지가 그 뜻입니다)

그리고 2번 질문이 좋네요^^

2번은 구현을 어떻게 하셨느지 안보이는데, JPA에서 em.find()를 제외한 모든 호출은 JPQL을 통한 호출입니다. JPQL을 통한 모든 호출은 우선 데이터베이스를 조회합니다.

em.find()는 정확하게 엔티티 ID로 엔티티를 찾을 수 있기 때문에 영속성 컨텍스트만 조회하면 쉽게 결과를 얻을 수 있습니다.

그런데 JPQL은 복잡한 쿼리이기 때문에 기술적으로 이 JPQL을 번역해서 영속성 컨테스트를 조회하는 것은 한계가 있습니다. 그래서 우선 JPQL을 SQL로 변환한 다음 데이터베이스를 먼저 조회합니다^^!

땅땅님의 프로필 이미지
땅땅

작성한 질문수

질문하기