본문 바로가기

JPA

[개념] JPA 프로그래밍 - 05. 연관관계 매핑 기초

단방향 연관관계

  • @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 프로그래밍 - 김영한 지음