본문 바로가기
ORM(JPA)

[JPA] 연관관계 매핑 - 1:1(일대일), N:N(다대다)

by hjhello423 2020. 2. 1.

[스프링/JPA] - [JPA] 연관관계 매핑 - N:1(다대일), 1:N(일대다)


1:1 매핑과 N:N 매핑에 대해 순서대로 살펴보겠습니다.


1:1 (일대일)

 1:1 관계는 양쪽이 서로 하나의 관계를 가지는 경우입니다.
테이블에서는 FK(외래 키)가 어느 쪽의 테이블에 있던 양방향 조회가 가능합니다.

따라서 테이블 관점에서 봤을 때 주/대상 테이블 어느 쪽이든 FK가 위치할 수 있습니다.

아래의 2가지 경우를 살펴보겠습니다.

MEMBER(회원) 테이블이 주 테이블,  LOCKER(사물함) 테이블이 대상 테이블인 경우에 1:1 관계를 살펴보죠.

경우 FK 위치    
주 테이블에 FK MEMBER FK를 객체 참조와 비슷하게 사용 가능 개발자 선호
대상 테이블에 FK LOCKER 1:1 -> 1:N 으로 DB 설계 변경 유용 DBA 선호

주 테이블에 외래 키 있을 경우

1:1 단방향

<Member.java>

@Entity
public class Member {

    @Id
    @GeneratedValue
    @Column(name = "member_id")
    private Long id;

    private String userName;

    @OneToOne
    @JoinColumn(name = "locker_id")
    private Locker locker;
}

 

<Locker.java>

public class Locker {

    @Id
    @GeneratedValue
    @Column(name = "locker")
    private Long id;

    private String name;
}

@OneToOne을 이용하여 1:1 관계를 매핑하였습니다.

그리고 @JoinColumn(name = "locker_id")을 선언하여 FK를 참조하였습니다.

이경우 별다른 어려움 없이 쉽게 관계를 매핑할 수 있습니다.

 

1:1 양방향

<Locker.java>

public class Locker {

    @Id
    @GeneratedValue
    @Column(name = "locker")
    private Long id;

    private String name;

    @OneToOne(mappedBy = "locker")
    private Member member;
}

1:1 양방향의 경우에 Locker에 @OneToOne을 선언하여 양방향 관계를 만들고 mappedBy 속성을 이용해 관계의 주인을  회원(Member)으로 지정하였습니다.


대상 테이블에 외래 키 있을 경우

1:1 단방향

이경우 JPA에서 관계를 표현하는 방법을 지원하지 않습니다.

첫 번째로 관계의 방향을 수정하는 방법. 두 번째로 양방형 관계를 만들고 주인은 Locker로 지정하는 방법이 있습니다.

1:1 양방향

<Member.java>

@Entity
public class Member {

    @Id
    @GeneratedValue
    @Column(name = "member_id")
    private Long id;

    private String userName;

    @OneToOne(mappedBy = "member")
    private Locker locker;
}

 

<Locker.java>

public class Locker {

    @Id
    @GeneratedValue
    @Column(name = "locker")
    private Long id;

    private String name;

    @OneToOne
    @JoinColumn(name = "member_id")
    private Member member;
}

관계의 주인을 Locker로 변경하였습니다.

대상 테이블에 FK를 둘 경우 양방향 매핑으로 변경하여 관계 표현이 가능합니다.


N:N (다대다)

N:N은 천천히 추가하겠습니다.. ㅠ


참고

자바 ORM 표준 JPA 프로그래밍, 김영한, 에이콘

 

반응형

댓글