Spring & Spring Boot/Spring
[JPA] 다양한 연관관계 매핑 (3) 일대일
Serina_Heo
2023. 4. 11. 21:52
일대일 관계는 양쪽이 서로 하나의 관계를 가진다.
예를 들어 회원은 하나의 사물함을 가지고, 사물함은 하나의 회원에 의해 사용된다.
고로, 일대다와 다대일에서 항상 다(N) 쪽이 FK 를 가졌으나, 일대일 관계에서는 FK 가 어디에 있든 상관없다.
주(main) 테이블이든 대상 테이블이든 FK 하나만 있으면 양쪽을 조회할 수 있다.
1.1. 주 테이블에 외래키
아래는 일대일 단방향, 주 테이블에 외래키가 있는 예제 코드이다.
@Entity
public class Member {
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
private String username;
@OneToOne
@JoinColumn(name = "LOCKER_ID")
private Locker locker;
// Getter, Setter...
}
@Entity
public class Locker {
@Id @GeneratedValue
@Column(name = "LOCKER_ID")
private Long id;
private String name;
// Getter, Setter...
}
아래 예제 코드는 일대일 주 테이블에 외래 키, 양방향이다.
양방향이므로 연관관계 주인을 정해야 한다. FK를 가지고 있는 쪽이 주인이 된다.
@Entity
public class Member {
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
private String username;
@OneToOne
@JoinColumn(name = "LOCKER_ID")
private Locker locker;
// Getter, Setter...
}
@Entity
public class Locker {
@Id @GeneratedValue
@Column(name = "LOCKER_ID")
private Long id;
private String name;
@OneToOne(mappedBy = "locker")
private Member member;
// Getter, Setter...
}
1.2. 대상 테이블에 외래 키
단방향
일대일 관계 중 대상 테이블에 외래키가 있는 단방향 관계는 JPA 에서 지원 x
양방향
일대일 매핑에서 대상 테이블에 외래 키를 두고 싶으면 이렇게 양방향으로 매핑한다.
@Entity
public class Member {
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
private String username;
@OneToOne(mappedBy = "member")
private Locker locker;
// Getter, Setter...
}
@Entity
public class Locker {
@Id @GeneratedValue
@Column(name = "LOCKER_ID")
private Long id;
private String name;
@OneToOne
@JoinColumn(name = "MEMBER_ID")
private Member member;
// Getter, Setter...
}
Reference : 자바 ORM 표준 JPA 프로그래밍 (김영한 저)