작성
·
47
0
일대다 단방향 연관관계에서,
@Entity
public class Member {
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
@Column(name = "USERNAME")
private String name;
... getter and setter
}
@Entity
public class Team {
@Id @GeneratedValue
@Column(name = "TEAM_ID")
private Long id;
private String name;
@OneToMany
@JoinColumn(name = "TEAM_ID")
private List<Member> members = new ArrayList<>();
... getter and setter
}
Member member = new Member();
member.setName("member1");
em.persist(member);
Team team = new Team();
team.setName("teamA");
team.getMembers().add(member);
em.persist(team);
1-1. @OneToMany @JoinColumn(name = "TEAM_ID") private List<Member> members = new ArrayList<>();를 통해 MEMBER테이블에 TEAM_ID컬럼이 생기는거 같은데, 다른 여러 테이블도 있다고 가정했을때 어떤 이유로 MEMBER테이블에 TEAM_ID컬럼이 생성되는것인가요? @JoinColumn(name = "TEAM_ID")만 보고 MEMBER테이블인지 어떻게 아는것인가요..? List<Member> members 에서 Member라고 지정해줬기때문에 MEMBER테이블에 TEAM_ID컬럼이 생기는것인가요?
1-2 @OneToMany와 @JoinColumn을 통해 일대다 단방향 연관관계나 일대다 양방향 연관관계를 하게되면 무조건 다쪽 테이블에 외래키 컬럼이 추가되는건가요??
답변 1
1
안녕하세요, 인프런 AI 인턴입니다. 오리쉐리님.
JPA에서 @OneToMany
와 @JoinColumn
을 사용하여 일대다 연관관계를 매핑하게 되면, 실질적으로 JPA는 두 엔티티 간의 관계를 관리하기 위해 외래 키(Foreign Key)를 생성하게 됩니다. 아래에서는 질문하신 사항에 대한 답변을 드리겠습니다.
1-1. @OneToMany
와 @JoinColumn(name = "TEAM_ID")
를 지정하면 List<Member> members
에서 Member
엔티티와의 관계를 지정하고 있습니다. 따라서 JPA는 특정 팀의 멤버들을 연관시키기 위해 MEMBER
테이블에 TEAM_ID
라는 외래 키 컬럼을 자동으로 생성합니다. 이는 JPA가 List<Member>
타입의 컬렉션이 연관된 엔티티 Member
를 지칭한다는 것을 알기 때문입니다. 기본적으로, JPA는 연관된 엔티티 타입과 @JoinColumn
에서 지정한 컬럼 이름을 바탕으로 외래 키를 생성하게 됩니다.
1-2. 네, @OneToMany
와 @JoinColumn
을 이용한 연관관계 매핑에서는 다인 엔티티 쪽에 외래 키가 추가되는 방식으로 매핑이 이루어집니다. 이는 JPA가 자동으로 연관 관계를 효율적으로 관리하기 위한 기본 메커니즘입니다. 따라서 일대다 단방향, 양방향 연관관계의 경우, 항상 다(N) 쪽 테이블에 외래 키 컬럼이 추가되어 관계를 설정합니다.
관련해서 더 자세히 알고 싶으시면 아래 링크를 참고해 주세요.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.