단방향 연관관계
- @ManyToOne
- 다대일(N : 1) 관계라는 매핑 정보
- 연관관계를 매핑할 때, 이렇게 다중성을 나타내는 어노테이션 필수
- @JoinColumn(name="TEAM_ID")
- 조인컬럼은 외래키를 매핑할 때 사용
- name 속성에 매핑할 외래키 이름 지정
- 생략 가능
양방향 연관관계
@Entity
public class Member {
@Id
@Column(name = "MEMBER_ID")
private Long id;
private String username;
@ManyToOne
@JoinColumn(name="TEAM_ID")
private Team team;
}
@Entity
public class Team {
@Id
@Column(name = "TEAM_ID")
private String id;
private String name;
//추가
@OneToMany(mappedBy="team")
private List<Member> members = new ArrayList<Member>();
}
- mappedBy
- 양방향 매핑일 때 사용
- 반대쪽 필드이름을 주면 됨
- 반대쪽 매핑이 Member.team 이므로 team을 값으로 줌
연관관계주인
양방향 연관관계 중 하나를 정해서 테이블의 외래키를 관리해야 하는데 이것을 연관관계의 주인이라고 한다.
양방향 매핑의 규칙: 연관관계의 주인
- 연관관계의 주인만이 데이타베이스 연관관계와 매핑된다.
- 연관관계의 주인만이 외래키를 관리(등록, 수정, 삭제)할 수 있다.
- 주인이 아닌 쪽은 읽기만 할 수 있다.
mappedBy 속성
- 주인이 아니면 mappedBy 속성을 사용해서 속성의 값으로 연관관계의 주인을 지정
- 주인은 mappedBy 속성을 사용하지 않는다.
연관관계의 주인은 외래키가 있는 곳
- 연관관계의 주인은 테이블에 외래 키가 있는 곳으로 정해야 한다.
- Team 엔티티는 mappedBy를 통해 주인이 아님을 설정.
class Team {
@OneToMany(mappedBy = "team") // 연관관계 주인인 Member.team
private List<Member> members = new ArrayList<Member>();
}
중요
- 연관관계의 주인만 데이터베이스 연관관계와 매핑, 외래 키를 관리.
- 주인이 아닌 반대편은 읽기만 가능, 외래 키를 변경하지 못한다.
- 항상 '다(N)'쪽이 외래 키를 가진다.
- @ManyToOne은 항상 연관관계의 주인이 됨. mappedBy 속성이 없다.
양방향 연관관계의 저장 및 주의점
주인이 아닌곳의 입력된 값은 외래키에 영향을 주지 않음
team1.getMembers().add(member1); //무시 (1)
team1.getMembers().add(member2); //무시 (2)
member1.setTeam(team1); //연관관계 설정(연관관계의 주인)
member2.setTeam(team1); //연관관계 설정(연관관계의 주인)
(1), (2) 실행시 아래와 같음
MEMBER_ID | USERNAME | TEAM_ID |
member1 | 회원1 | null |
member2 | 회원2 | null |
따라서, 연관관계 주인만이 외래키 값을 변경할 수 있다.
출처도서 : 자바 ORM 표준 JPA 프로그래밍 - 김영한 지음
'JPA' 카테고리의 다른 글
[개념] JPA 프로그래밍 - 07. 고급매핑 (0) | 2019.12.27 |
---|---|
[개념] JPA 프로그래밍 - 06. 다양한 연관관계 매핑 (0) | 2019.12.27 |
[개념] JPA 프로그래밍 - 04. 엔티티 매핑 (0) | 2019.12.27 |
[개념] JPA 프로그래밍 - 03. 영속성 관리 (0) | 2019.12.27 |
[개념] JPA 프로그래밍 - 01. JPA 소개 (0) | 2019.12.27 |