작성
·
100
0
안녕하세요. 연관관계 부분이 많이 헷갈리지만 확실히 알고 가고 싶어서 좀 더 공부하면서 알아보고 있다가 질문드릴게 있어서요..!
강의에서 연관관계의 주인만 외래키를 관리할수 있다는 의미에 대해서 코드로 제가 이해한 바가 맞는지 직접 확인해보았는데요.
연관관계의 주인만 setTeam()메서드 등을 통해 외래키를 추가 및 변경할 수 있고, 연관관계의 주인이 아닌쪽은 외래키를 참조해서 조회만 할수 있다.
예를들어,
Team team = new Team();
em.persist(team);
Member member1 = new Member();
Member member2 = new Member();
Member member3 = new Member();
member1.setTeam(team); // 이렇게 해야함
member2.setTeam(team); // 이렇게 해야함
em.persist(member1);
em.persist(member2);
em.persist(member3);
team.getMembers().add(member3);
// 이렇게만 하면, member3의 외래키(TEAM_ID)가 설정되지않음.
// 즉 member3의 team필드는 여전히 null이다.
List<Member> newMembers = new ArrayList<>();
Member member4 = new Member();
em.persist(member4);
newMembers.add(member4);
team.setMembers(newMembers);
// 이렇게만 하면, member4의 외래키(TEAM_ID)가 설정되지않음.
// 즉 member4의 team필드는 여전히 null이다
tx.commit();
//그래서 위와같이하면, 이 상태로 db에 저장된다고 해도, 이후에 team.getMembers()를 호출하면, 리스트안에 member1, member2만 있고 member3과 member4는 없다.
이렇게 이해하는게 맞을까요..? 항상 질문에 답해주셔서 정말 감사드립니다..!
답변 2
0
참고해주신 게시물들을 종합해보면 결국
연관관계의 주인만 setTeam()메서드 등을 통해 외래키를 추가 및 변경할 수 있고,
연관관계의 주인이 아닌쪽에서 team.getMembers().add(member3);나 team.setMembers(newMembers);를 하더라도 외래키가 추가 및 변경이 안되고 이후에 team.getMembers()를 호출해서 조회하면, 리스트안에 member1, member2만 있고 member3과 member4는 없다.
이렇게 이해해도 괜찮을까요?
0
안녕하세요, 인프런 AI 인턴입니다. 오리쉐리님께서 질문하신 내용은 연관관계의 주인 개념에 대한 중요한 이해를 돕는 부분입니다. JPA에서 연관관계의 주인은 외래 키를 소유하며 데이터베이스에서 그 외래 키를 직접 관리하는 역할을 합니다. 반면, 주인이 아닌 쪽은 이 정보에 대해 읽기만 할 수 있다는 것이죠.
오리쉐리님이 예시하신 코드에서 보여주듯이, member.setTeam(team)
을 통해 Member
객체의 team
필드에 팀을 설정해 주어야만 제대로 외래키가 관리됩니다. 반대로 team.getMembers().add(member3)
방식은 그저 Java 객체 상태만 변경할 뿐, 데이터베이스에 실제 저장될 때 영향이 없습니다.
아래 게시물들이 오리쉐리님의 궁금증을 해소하는데 더 큰 도움이 될 수 있습니다:
주인이 아닌 관계에서 읽기 질문 - 이 질문에서는 왜 연관관계의 주인이 아닌 쪽에서 데이터를 추가하는 것이 DB에 반영되지 않는지를 다룹니다.
ManyToOne OneToMany 연관관계에서 궁금한점.. - 양방향 연관관계에서 편의 메소드와 연관관계의 주인의 사용법에 대해 설명하고 있습니다.
연관관계 주인의 중요성 - 연관관계에서 주인의 역할과 왜 주인을 명확히 지정해야 하는지에 대한 설명이 포함되어 있습니다.
이러한 자료들을 통해 오리쉐리님께서 가지고 계신 궁금증을 해소하고, 연관관계의 주인 개념을 명확히 이해할 수 있기를 바랍니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
안녕하세요. 오리쉐리님, 공식 서포터즈 David입니다.
네, 이해하신 게 맞습니다:)
감사합니다.