해결된 질문
작성
·
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로 변환한 다음 데이터베이스를 먼저 조회합니다^^!