연관관계 매핑

2021. 1. 19. 14:44JPA/JPA

다중성

  • 일대일: @OneToOne
  • 일대다: @OneToMany
  • 다대일: @ManyToOne
  • 다대다: @ManyToMany -> 실무에서 사용안함. 관계형 데이터베이스는 다대다 관계를 표현할 수 없으며 일대다, 다대일 관계로 풀어내야하고, 엔티티도 이에 맞게 설계되야한다.

방향

단방향

  • 단방향: Member 엔티티에서 Team 엔티티로만 참조할 수 있는 구조
  • 외래키(TEAM_ID)가 있는 엔티티(Member)에 @ManyToOne 어노테이션을 적용하고 @JoinColumn( name = "TEAM_ID")를 적용하면 단방향 연관관계 매핑이 끝난다.
  • 연관관계 매핑이 되면, 데이터 등록, 삭제시 JPA가 연관관계에 따라 데이터를 바인딩해준다.
 @Entity
 public class Member {
 	@Id
    @GeneratedValue
    private Long id;
    
    @ManyToOne
    @JoinColumn(name = "TEAM_ID")
    private Team team;
}

양방향

  • 양방향: Member엔티티에서 Team엔티티로, Team엔티티에서 Member엔티티로 각각 참조할수 있는 구조
  • 양방향 연관관계는 복잡하고 여러가지 문제를 내포하고 있음으로, 설계시, 단방향으로 모든 연관관계를 끝내놓고 정말 필요하다고 생각될때, 양방향을 생각해야한다.

연관관계 주인

  • 양방향 연관관계일때, 문제가 생긴다. 한 Member가 team을 변경해야한다고 했을때, MEMBER테이블 입장에서 Member엔티티의 team을 변경하는것을 보는게 맞을까, 아니면 Team 엔티티의 members 리스트를 보고 있는것이 맞을까?
  • 두 경우 중 더 알맞는 것을 찾아 한 곳을 바라보게 해야한다. 그것이 연관관계의 주인이다.
  • 연관관계의 주인은 외래키가 있는 엔티티로 설정하는 것을 권장한다.
  • 연관관계의 주인이 아닌 엔티티(Team)에 @OneToMany( mappedBy = "team" )을 설정하여 주인을 지정해준다.
  • 이렇게 지정되면 연관관계의 주인만 등록, 변경, 삭제가 가능하고 주인이 아닌 엔티티는 읽기만 가능하게 된다.
@Entity
public class Team {

    @Id @GeneratedValue
    private Long id;


    @OneToMany(mappedBy = "team")
    List<Member> members = new ArrayList<Member>();
}