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

형종님의 프로필 이미지
형종

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

값 타입 컬렉션

값 타입 컬렉션 대안

작성

·

92

0

image.pngimage.pngimage.png

 

image.png

update도 보면 create one-to-many row 업데이트가

나오지 않으며 id도 1씩 추가가 되지 않습니다. 왜 이런건지 이해가 안되네요 38:37초 입니다.

 

 

답변 2

0

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

안녕하세요. 형종님

도움을 드리고 싶지만 질문 내용만으로는 답변을 드리기 어렵습니다.

실제 동작하는 전체 프로젝트를 ZIP파일로 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx

 

주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요

 

추가로 다음 내용도 코멘트 부탁드립니다.

1. 문제 영역을 실행할 수 있는 방법

2. 문제가 어떻게 나타나는지에 대한 상세한 설명 (오류 화면, 오류 로그 포함)

 

링크: 공식 서포터즈

링크: 자주하는 질문

감사합니다.

형종님의 프로필 이미지
형종
질문자

https://drive.google.com/file/d/1tjsu0t3huv-8p0RzDV7d5CkCqyB7w0PW/view?usp=sharing

 

insert favoriteFoods와 AddressEntity만 될뿐

AddressHistory는 Create밑 Update가 되지 않습니다. 그냥 자체적으로 실행조차 뜨지 않네요

 

image.png

 

 

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

안녕하세요. 형종님

올려주신 코드를 확인해보았는데요.

하이버네이트가 버전이 올라가면서 남기는 로그가 약간 변경된 것 같아요.

create one-to-many row라는 메시지는 나오지 않지만, 다음 로그를 통해서 ADDRESS가 update 되는 것을 확인할 수 있습니다.

Hibernate: 
    /* insert for
        hellojpa.AddressEntity */insert 
    into
        ADDRESS (city, street, zipcode, id) 
    values
        (?, ?, ?, ?)
Hibernate: 
    /* insert for
        hellojpa.AddressEntity */insert 
    into
        ADDRESS (city, street, zipcode, id) 
    values
        (?, ?, ?, ?)
Hibernate: 
    update
        ADDRESS 
    set
        MEMBER_ID=? 
    where
        id=?
Hibernate: 
    update
        ADDRESS 
    set
        MEMBER_ID=? 
    where
        id=?

추가로 AddressEntity의 저장 테이블인(@Table로 매핑한) ADDRESS 테이블에도 데이터가 정상 저장된 것을 데이터베이스를 통해서 확인할 수 있었습니다.

하이버네이트 버전에 따라서 로그가 조금씩 변경되기는 하는데요. 이럴 때는 데이터베이스에 보관된 데이터를 확인해보시면 더 확실히 알 수 있습니다 🙂

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다. 형종님.

값 타입 컬렉션의 대안으로 일대다 관계를 설정한 경우, 연관된 몇 가지 질문에 대해 답변드리겠습니다:

1. 왜 update 쿼리가 나가는가?

일대다 관계를 설정할 때, 부모 엔티티가 연관된 자식 엔티티 리스트를 가지고 있습니다. 이 관계에서, 자식 엔티티는 외래 키(member_id)를 통해 부모 엔티티와 연결됩니다.

  1. id가 없는 이유:

    • 일대다 관계에서는 자식 엔티티(AddressEntity)의 외래 키(member_id)는 값이 처음에는 null로 설정되며, 부모 상태가 저장되거나 갱신될 때 나중에 설정됩니다.
  2. 연관된 update 쿼리:

    • 처음에 자식 테이블에 데이터를 삽입할 때, 외래 키 member_id 값이 없기 때문에 insert 쿼리가 먼저 실행됩니다.
    • 그 후에, 부모 엔티티와 자식 엔티티를 연결하기 위해 외래 키를 업데이트하는 update 쿼리가 실행되는 것입니다.

관련 질문과 답변

JPA 값 타입 컬렉션 대안에 대한 설명

추가 리소스

JPA 일대일 또는 일대다 관계 매핑

질문 요약 및 답변

  1. 왜 insert될 때 memberid값이 없는거죠? 일대다는 단방향은 일대 FK가 있어서 다엔 member_id가 없는건가요?

    • 네, 처음에는 다쪽의 외래 키가 설정되지 않아 insert될 때는 기본적으로 null로 저장됩니다. 이후 프로세스에서 FK 값이 업데이트 됩니다.
  2. addressentity table엔 member_id 컬럼이 없는데 뭘 업데이트 하는거죠?

    • AddressEntity 테이블에 member_id 컬럼이 존재해야 합니다. 이 컬럼을 통해 부모-자식 간 FK 관계가 설정됩니다. FK 설정이 빠져 있어서 발생하는 문제일 수 있습니다. 이 부분을 코드나 데이터베이스 구조와 같이 점검해 보셔야 할 것 같습니다.

저는 질문자님의 이해를 돕고자 기존 질문에 대한 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

형종님의 프로필 이미지
형종

작성한 질문수

질문하기