일대일 관계는 그 반대도 일대일
주 테이블이나 대상 테이블 중에 외래 키 선택 가능
외래 키에 데이터베이스 유니크 제약조건 추가
Member 엔티티
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
private String username;
@OneToOne
@JoinColumn(name = "LOCKER_ID")
private Locker locker;
}
Locker 엔티티
@Entity
public class Locker {
@Id @GeneratedValue
@Column(name = "LOCKER_ID")
private Long id;
private String name;
}
@ManyToOne
단방향 매핑과 유사하다.주 테이블에 외래 키 단방향 Locker
엔티티 코드에 아래의 코드만 추가하면 된다.
@OneToOne(mappedBy = "locker")
private Member member;
mappedBy
적용Member가 연관 관계의 주인이 되고 싶은데 테이블에서 외래키가 Locker에 있는 상태
단방향 관계는 JPA가 지원하지 않는다.
1:1은 외래키를 어디에 둬도 상관이 없다면, member에 있는게 좋을까 locker에 있는게 좋을까?
-> 미래에 회원 한 명이 여러 라커를 가질 수 있도록 바뀐다면, locker에 외래키를 두는 양방향이 좋을 것이다.
(locker에 있는 member_id의 유니크 제약 조건만 alter
로 제거하면 되기 때문이다.)
비즈니스에서는 회원 조회가 많이 일어나기 때문에, 라커 정보를 가져올 때도 조인할 필요 없이 쿼리 한 방으로 라커 정보를 알 수 있는 성능 상의 이점이 있다.
(회원이 어떤 라커를 이용하고 있는지 조회하는 경우가 많다.)
주 테이블에 외래 키
대상 테이블에 외래 키
Member.locker
를 조회할 때, JPA는 프록시를 만들기 위해 Member.locker에 값이 있는지 미리 알아야 한다.참고 :
김영한. 『자바 ORM 표준 JPA 프로그래밍』. 에이콘, 2015.