inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

일대다 [1:N]

MEMBER테이블에 TEAM_ID컬럼이 생기는 이유

97

오리쉐리

작성한 질문수 108

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을 통해 일대다 단방향 연관관계나 일대다 양방향 연관관계를 하게되면 무조건 다쪽 테이블에 외래키 컬럼이 추가되는건가요??

java jpa

답변 1

1

인프런 AI 인턴

안녕하세요, 인프런 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) 쪽 테이블에 외래 키 컬럼이 추가되어 관계를 설정합니다.

관련해서 더 자세히 알고 싶으시면 아래 링크를 참고해 주세요.

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

벌크연산에서 member.getAge 호출 시 영속성 컨텍스트에서 데이터를 가져오는건가요?

0

33

2

inheritance startegy 선택시 고려사항

0

24

1

Entity 동등성 비교

0

23

1

실무 조언 관련 질문입니다.

0

48

1

H2데이터베이스 파일 생성

0

58

2

서브쿼리 강의에서 ALL 예시 관련 질문드립니다.

0

56

2

수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?

0

58

1

JPQL 메소드와 락

0

55

1

Delivery @OneToOne

0

61

1

17강 4~5분대 테이블 값 조회가 안됩니다.

0

97

2

UnsupportedOperationException 발생

0

86

3

H2 Database 연결이 안됩니다.

0

98

2

연관관계 매핑 질문드립니다.

0

87

2

h2데이터베이스 실행오류

0

110

2

persistence.xml

0

112

2

양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?

0

83

1

영속성 컨텍스트

0

69

1

JPA 프록시

0

98

1

Native Query와 MyBatis

0

71

1

영속성 컨텍스트는 어떤 메모리에 저장되는건가요?

0

92

1

임베디드 타입 예시 코드 관련 질문

0

121

3

명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요

0

96

3

인텔리제이 패키지 커서 단축키 질문

0

109

2

혹시 현재는 ID 데이터 타입이 String이면 안되나요?

0

149

1