티스토리 뷰

객체의 참조와 테이블의 외래 키 매핑

  • 방향
    • 방향은 객체에만 존재하고 테이블 관계는 항상 양방향이다.
    • 단방향
      • 두 관계 중 한 쪽만 참조하는 것
    • 양방향
      • 두 관계 양쪽 모두 서로 참조하는 것 

 

  • 다중성
    • 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:N)이 있다.

 

  • 연관관계의 주인
    • 객체를 양방향 연관관계로 만들면 연관관계의 주인을 정해야 한다.
    • 연관관계의 주인은 외래 키의 위치와 관련해서 정한다.
      • ex) 회원과 팀 관계에서 외래 키가 있는 "다" 쪽인 회원이 연관관계의 주인이 된다.

 

객체 연관관계와 테이블 연관관계의 차이

  • 객체는 참조(주소)로 연관관계를 맺는다.
    • ex) a.getB().getC()
  • 테이블은 외래 키로 연관관계를 맺는다.
    • ex) A JOIN B
  • 참조를 사용하는 객체의 연관관계는 단방향이다. 객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야 한다.
  • 외래 키를 사용하는 테이블의 연관관계는 양방향이다.

 

연관 관계 매핑

  • @JoinColumn
    • 외래 키를 매핑할 때 사용한다. name 속성에 매핑할 외래 키 이름을 지정한다.
  • @ManyToOne
    • 다대일 관계라는 매핑 정보

 

단방향 연관관계 회원 -> 팀 (N:1)

@Entity
public class Member {
	
    @Id
    @Column(name = "MEMBER_ID")
    private String id;
    
    private String username;
    
    //연관관계 매핑
    //객체의 Member.team과 테이블의 MEMBER.TEAM_ID를 매핑
    @ManyToOne
    @JoinColumn(name = "TEAM_ID")  //매핑할 외래 키 이름
    private Team team;
    
    //연관관계 설정
    public void setTeam(Team team){
    	this.team = team;
    }
    
    //Getter, Setter ...
}
@Entity
public class Team {

    @Id
    @Column(name = "TEAM_ID")
    private String id;
    
    private String name;
    
    //Getter, Setter ...
}

 

양방향 연관관계 회원 -> 팀 (N:1), 팀 -> 회원 (1:N)

@Entity
public class Member {
	
    @Id
    @Column(name = "MEMBER_ID")
    private String id;
    
    private String username;
    
    @ManyToOne
    @JoinColumn(name = "TEAM_ID")
    private Team team;
    
    public void setTeam(Team team){
    	this.team = team;
    }
    
    //Getter, Setter ...
}
@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>();
    
    //Getter, Setter ...
}

 

연관관계의 주인

  • 엔티티를 양방향 연관관계로 설정하면 객체의 참조는 둘인데 외래 키는 하나다.
  • 두 객체 연관관계 중 하나를 정해서 테이블의 외래 키를 관리해야 하는데 이것을 연관관계의 주인이라 한다.
  • 연관관계의 주인만이 데이터베이스 연관관계와 매핑되고 외래 키를 관리(등록, 수정, 삭제)할 수 있다. 반면에 주인이 아닌 쪽은 읽기만 할 수 있다.
  • 데이터베이스 테이블의 다대일, 일대다 관계에서는 항상 다 쪽이 외래 키를 가진다.
  • 단방향에서 연관관계의 주인은 외래 키가 있는 곳을 기준으로 매핑한다.

 

참고

김영한, 『자바 ORM 표준 JPA 프로그래밍』, 에이콘출판주식회사(2015)

댓글
Total
Today
Yesterday
링크
Apple 2023 맥북 프로 14 M3, 스페이스 그레이, M3 8코어, 10코어 GPU, 512GB, 8GB, 한글