Spring JPA
[Spring JPA] 일대일 관계
hoondev3
2023. 1. 28. 14:32
일대일 관계
일대일 관계는 주 테이블과 대상테이블중에 외래키를 어디 넣을지 선택이 가능하다.
일대일 관계로 Member와 Locker를 들 수 있다. 둘다 서로를 1개씩만 가지고 있기 때문에 일대일 관계로 매핑할 수 있다.
주 테이블에 외래키
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
@OneToOne
@JoinColumn(name = "LOCKER_ID")
private Locker locker;
…
}
@Entity
public class Locker {
@Id @GeneratedValue
private Long id;
@OneToOne(mappedBy = "locker")
private Member member
...
}
다대일, 일대다와 마찬가지로 mappedBy로 양방향 관계를 이룰 수 있다. 이 member는 읽기 전용 필드이다.
여기서도 마찬가지로 외래키가 있는 쪽이 연관관계의 주인이다.
이 방법의 장점은 주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인이 가능하다.
단점은 값이 없으면 외래키에 null을 허용해야 한다.
대상 테이블에 외래키
대상 테이블에 외래키가 있는 경우의 단방향은 지원하지 않는다.
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
@OneToOne(mappedBy = "member")
private Locker locker;
…
}
@Entity
public class Locker {
@Id @GeneratedValue
private Long id;
@OneToOne
@JoinColumn(name = "MEMBER_ID")
private Member member
...
}
양방향은 위에 있는 주 테이블에 외래키가 있을때의 양방향을 반대로 뒤집은 상태로 가능하다.
여기서는 연관관계의 주인이 member가 되고 Locker의 locker는 읽기 전용 필드로 설정된다.
이방법의 장점은 주 테이블과 대상 테이블을 일대일에서 일대다 관계로 변경할 때 테이블 구조를 유지할 수 있다.
단점은 기본 프록시의 기능 한계로 지연로딩으로 설정해도 항상 즉시로딩으로 동작한다는 단점이다.