[6단원] 다대일 단방향 [N:1] 연관관계

개요

  • 다대일 단방향 연관관계의 경우 여러 엔티티가 하나의 다른 엔티티를 참조할 수 있는 구조
  • 참조하는 쪽이 외래 키를 가진다.

  • 객체 연관
    • Member 객체는 Team 객체를 team 필드를 통해 참조함.
  • 테이블 연관
    • MEMBER 테이블의 TEAM_ID 컬럼은 외래 키(FK) 로서 TEAM 테이블의 TEAM_ID 를 참조함.
public class Team {
    
    @Id
    @GeneratedValue
    @Column(name = "TEAM_ID")
    private Long id;
    
    @Column(name = "NAME")
    private String name;
    
    @OneToMany(mappedBy = "team")
    private List<Member> members = new ArrayList<>();
    
    public Team(Long id, String name) {
        this.id = id;
        this.name = name;
    }
    
    public void addMember(Member member) {
        this.members.add(member);
        if (member.getTeam() != this) { // 무한루프에 빠지지 않도록 처리함.
            member.setTeam(this);
        }
    }
}


public class Member {
    @Id
    @Column(name = "MEMBER_ID")
    private String id;
    
    @Column(name = "USERNAME")
    private String username;
    
    // 연관관계 매핑
    @ManyToOne
    @JoinColumn(name = "TEAM_ID")
    private Team team;
    
    @OneToMany(mappedBy = "member", orphanRemoval = true)
    private List<Order> orders = new ArrayList<>();
    
    public Member(String id, String username) {
        this.id = id;
        this.username = username;
    }
    
    public void setTeam(Team team) {
        this.team = team;
        // 무한루프에 빠지지 않도록 체크
        if (!team
            .getMembers()
            .contains(this)) {
            team
                .getMembers()
                .add(this);
        }
    }

양방향은 외래 키가 있는 쪽이 연관관계의 주인

  • 일대다와 다대일 연관관계는 항상 다(N) 에 외래 키가 존재
  • 다쪽인 MEMBER 테이블이 외래 키를 가지고
    • 주인이 아닌 Team.members 조회를 위한 JPQL 혹은 객체 그래프 탐색시 사용

양방향 연관관계는 항상 서로를 참조함

● 양방향 연관관계는 항상 서로를 참조해야 한다
양방향 연관관계는 항상 서로 참조해야 한다. 어느 한 쪽만 참조하면 양방향 연
관관계가 성립하지 않는다. 항상 서로 참조하게 하려면 연관관계 편의 메소드를
작성하는 것이 좋은데 회원의 setTeam(), 팀의 addMember()메소드가 이런 편
의 메소드들이다. 편의 메소드는 한 곳에만 작성하거나 양쪽 다 작성할 수 있는
데, 양쪽에 다 작성하면 무한루프에 빠지므로 주의해야 한다. 예제 코드는 편의
메소드를 양쪽에 다 작성해서 둘 중 하나만 호출하면 된다. 또한 무한루프에 빠
지지 않도록 검사하는 로직도 있다.
  1. 양방향 연관관계
    • Team 과 Member 엔티티가 존재시
    • Team ↔ Member 를 서로 참조하는 관계를 양방향 연관관계라고 함
  1. 편의 메서드
    • 연관관계를 설정시, 양쪽 엔티티에서 서로 참조를 설정하는 것을 도와주는 헬퍼 메서드
    • setTeam()Member 엔티티에서 Team 설정시 사용
      • 동시에 Teammembers 리스트에 자신을 추가함
    • addMember()Team 엔티티에서 Member 설정시 사용
      • 동시에 Memberteam 에 자신을 설정
  1. 무한 루프 문제!
    • 양쪽에 편의메서드가 존재하고 , 서로를 호출하게 되는 경우 무한루프의 위험성이 있습니다.


Uploaded by N2T