Chapter5. 연관관계 매핑

김신영·2022년 11월 16일
0

JPA

목록 보기
3/14
post-thumbnail

테이블과 객체의 연관관계 매핑

객체의 참조와 테이블의 FK를 매핑하는 것이 목표

연관관계 핵심 키워드

1. 방향성

  • 테이블 관계는 항상 양방향이다.

2. 다중성

  • N:1 (다대일)
  • 1:N (일대다)
  • 1:1 (일대일)
  • N:M (다대다)

3. 연관관계의 주인

  • 객체를 양방향 연관관계로 만들면 연관관계의 주인을 지정해야 한다.

객체 연관관계

  • 참조를 통한 객체 연관관계는 언제나 단방향이다.
  • 서로 다른 단방향 관계 2개를 통해 양방향 관계를 이룬다.

class Member {
   private Long id;
   private String name;
   private Team team;
}

class Team {
   private Long id;
   private String name;
   private List<Member> memberList;
}

member.getTeam()

team.getMemberList()

테이블 연관관계

  • 외래 키를 통해 양방향 연관관계를 이룬다.

SELECT *
FROM   MEMBER M
       JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID

SELECT *
FROM   TEAM T
       JOIN MEMBER M ON T.TEAM_ID = M.TEAM_ID   

객체, 테이블 연관관계 매핑

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

![https://velog.velcdn.com/images%2Fasdfg5415%2Fpost%2Fa44ac7a6-445e-4b7c-85ed-032fd2317472%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fasdfg5415%2Fpost%2Fa44ac7a6-445e-4b7c-85ed-032fd2317472%2Fimage.png)

@Entity
@Table(name = "MEMBER")  
@Getter  
@Setter  
@NoArgsConstructor  
public class Member {  
  
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)  
    @Column(name = "MEMBER_ID")  
    private Long id;  
  
    @Column(name = "USERNAME")  
    private String name;  
  
    @ManyToOne(fetch = FetchType.LAZY)  
    @JoinColumn(name = "TEAM_ID")  
    private Team team;
}

@Entity  
@Table(name = "TEAM_TABLE")  
@Getter  
@Setter  
@NoArgsConstructor  
public class Team {  
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)  
    @Column(name = "TEAM_ID")  
    private Long id;  
  
    private String name;  
  
    @OneToMany(mappedBy = "team")  
    private List<Member> members = new ArrayList<>();
}

@JoinColumn

  • 외래키와 필드를 매핑
속성기능기본값
name매핑할 외래 키 이름{필드명}_{참조하는 테이블의 기본키 컬럼명}
referencedColumnName외래 키가 참조하는 대상 테이블의 컬럼명참조하는 테이블의 기본키 컬럼명
foriegnKey (DDL)외래키 제약조건
unique@Column의 속성과 동일
nullable@Column의 속성과 동일
insertable@Column의 속성과 동일
updatable@Column의 속성과 동일
columnDefinition@Column의 속성과 동일
table@Column의 속성과 동일

@ManyToOne

속성기능기본값
optionalfalse로 설정하면 연관된 엔티티가 항상 있어야 한다.true
fetch글로벌 fetch 전략 설정@ManyToOne=FetchType.EAGER
@OneToMany=FetchType.LAZY
cascade영속성 전이 기능 설정
targetEntity연관된 Entity 클래스 설정

양방향 연관관계

  • 테이블은 외래 키 하나로 두 테이블의 연관관계를 관리한다.
  • 엔티티를 양방향 연관관계로 설정하면, 객체 필드 참조를 통해 단방향 연관관계 2개를 활용한다.

따라서 두 객체 필드 중 하나를 정해서 테이블의 외래키를 관리해야 한다.
이를 연관관계의 주인이라고 한다.

  • 연관관계의 주인만이 데이터베이스 연관관계와 매핑된다.
  • 연관관계 주인만이 외래키를 CRUD 할 수 있다.
  • 주인이 아닌 쪽은 읽기만 가능하다.

연관관계의 주인을 정하는 것은 외래 키 관리자를 선택하는 것이다.

연관관계의 주인은 외래 키의 위치와 관련해서 정해야한다.

profile
Hello velog!

0개의 댓글