[스프링/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 프로그래밍, 김영한, 에이콘
반응형
'ORM(JPA)' 카테고리의 다른 글
[JPA] jpa에서 복합키와 식별관계 매핑 하기 (1) | 2020.02.04 |
---|---|
[JPA] 상속 관계 매핑 (0) | 2020.02.03 |
[JPA] 연관관계 매핑 - N:1(다대일), 1:N(일대다) (0) | 2020.01.31 |
댓글