[JPA] 양방향 연관관계 주인 @ManyToOne / @OneToMany / MappedBy 선언위치

2022. 7. 11. 19:43·💻 개발/JPA, Querydsl
728x90
반응형

[요약]

1대多

多에 1을 조회할 수 있는 fk가 존재 

多는 연관관계의 주인 

多에서 @Joincolum선언은 1을 조회할 수 있는 fk를 나타냄

1에서는 mappedBy를 통해 단순조회 

 

1대1

연관관계 주인으로 선언한 곳에 

@JoinColumn(name = "종속관계_id")

연관관계의 종속에

@MappedBy("주인 객체")

 

1. 객체와 테이블 서로 다른 연관관계 


[Member와 Team의 연관관계]

객체와 테이블을 표현한 그림이다. 

객체, PK, FK에 주의하여 살펴보자

 

- 객체 연관관계 포인트 2가지

  •  회원-> 팀 1개
  •  팀 -> 회원 연관관계 1개

- 테이블 연관관계 1가지

  • 회원 <-> 팀의 관계 
  • FK와 PK로 양쪽의 연관관계를 알 수 있다.

[객체의 양방향 관계]

- 객체의 양방향 관계는 사실 양방향 관계가 아니라 서로 다른 단 반향 관계 2개다.

- 객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야 한다. 

 

예시

A -> B (ex: a.getB())

B -> A (ex: b.getA())

2. @ManyToOne과 @OneToMany


@Entity
public class Member {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "member_id")
	private Long id;

	@Column(name = "user_name")
	private String name;

	@ManyToOne
	private Team team;
}
@Entity
public class Team {
	@Id@GeneratedValue
	@Column(name = "Team_Id")
	private Long id;
    
	private String name;
    
	@OneToMany(mappedBy = "team")
	private List<Member> members = new ArrayList<>();
    
}

[Member입장에서]

1. 다수

2 Member에 ManyToOne 선언

[Team입장에서]

1. 소수 

2. Team에 OneToMany선언

3. MappedBy선언 

 

3. MappedBy는 Member와 Team 중 어디에 선언할까?


 

[테이블의 양방향 관계]

외래키 하나로 두 테이블의 연관관계를 정의한다.

Member의 TEAM_ID(FK)를 통해 TEAM을 알 수 있고, TEAM의 TEAM_ID(PK)를 통해 MEMBER를 알 수 있다.

 

 

4. 결론 : Member와 Team 중 어디에서 키를 관리할까?


~~에 의해 MappedBy 됐어  즉, 종에게 MappedBy를 선언한다.

[양방향 매핑 규칙]

1. 객체의 두 관계중 하나를 연관관계의 주인으로 지정

2. 연관관계의 주인만이 외래 키를 관리(등록, 수정)

3. 주인이 아닌쪽은 읽기만 가능

4. 주인은 mappedBy 속성 사용하지 않음

5. 주인이 아니면 mappedBy 속성으로 지정

[누구를 주인으로 할까?]

⭐️⭐️⭐️⭐️외래키가 있는 곳을 주인으로 정한다. (외래키는 보통 多쪽)

외래키  = 多 = 주인

@Entity
public class Team {
	@Id@GeneratedValue
	@Column(name = "Team_Id")
	private Long id;
    
	private String name;
    
	@OneToMany(mappedBy = "team")
	private List<Member> members = new ArrayList<>();
    
}
@Entity
public class Member {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "member_id")
	private Long id;

	@Column(name = "user_name")
	private String name;

	@ManyToOne
	private Team team;
}

여기에서는 Member.team이 연관관계 주인 

 

추가) @JoinColumn


[Member입장에서]

Member가 Join하는 컬럼을 선언 

 

@JoinColumn(name = "team_id")

private Team team;

 

해석하자면 Team 객체에서 가지고 있는 team_id를 통해 Join하겠다는 어노테이션

public class Member {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "member_id")
	private Long id;

	@Column(name = "user_name")
	private String name;

	@ManyToOne
	@JoinColumn(name = "team_id")
	private Team team;
}

 

 

 

 

 

 

혹시 더 좋은 방법이 있다면 댓글로 피드백 부탁드리겠습니다! 감사합니다.

 

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'💻 개발 > JPA, Querydsl' 카테고리의 다른 글

[Querydsl] 연관관계가 없는 테이블 연결 하기 / 연관관계 없는 엔티티 외부조인  (0) 2022.08.16
[JPA] @Inhertance 조인 전략 / 상속관계 매핑  (0) 2022.07.30
[JPA] @Entity란? / @Entity주의사항 / 리플랙션  (0) 2022.07.10
[JPA] 영속성 컨텍스트 | JPA 내부에서 어떻게 동작하는가?  (0) 2022.07.09
[Querydsl][오류] Cannot delete or update a parent row: a foreign key constraint fails  (0) 2022.07.08
'💻 개발/JPA, Querydsl' 카테고리의 다른 글
  • [Querydsl] 연관관계가 없는 테이블 연결 하기 / 연관관계 없는 엔티티 외부조인
  • [JPA] @Inhertance 조인 전략 / 상속관계 매핑
  • [JPA] @Entity란? / @Entity주의사항 / 리플랙션
  • [JPA] 영속성 컨텍스트 | JPA 내부에서 어떻게 동작하는가?
foodev
foodev
이것저것 개발과 이것저것 리뷰 합니다.
    반응형
    250x250
  • foodev
    개발 개맛집
    foodev
  • 전체
    오늘
    어제
    • 분류 전체보기 (109)
      • 🌟🙇🏻‍♂️ 꼭 읽어봤으면 하는 글 (4)
      • 💻 개발 (72)
        • 설정 및 세팅 (4)
        • DB&서버&네트워크&암호 (11)
        • React (0)
        • JPA, Querydsl (13)
        • 알고리즘 (7)
        • 언어 (15)
        • 프레임워크 (12)
        • HTML, CSS (10)
      • ✍🏻 (33)
        • 회고록 (15)
        • 독서록 (7)
        • 일지록 (10)
        • 세미나 (1)
      • 💡 리뷰 (0)
        • 제품리뷰 (0)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    di동작원리
    해피해킹 키매핑
    githubaction 라벨 ci/cd
    di란
    QueryDSL
    typedi 동작원리
    di의존성
    해피해킹 커스텀
    서이추
    창업패키지후기
    스냅샷과 히스토리
    typedi란
    githubaction 라벨 배포
    validation failed (numeric string is expected)
    스냅샷과히스토리성 차이
    개발썰
    해피해킹 카라비너
    db 날림
    해피해킹 방향키
    nestjs pipe body
    azure ci/cd
    디비스냅샷
    토이프로젝트개발일지
    스냅샷과로그성
    nestjs pipe
    JPA
    스냅샷방식
    db 초기화
    db 날린 썰
    해피해킹 꿀팁
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
foodev
[JPA] 양방향 연관관계 주인 @ManyToOne / @OneToMany / MappedBy 선언위치
상단으로

티스토리툴바