@OneToOne

2021-03-19

JPA를 공부하면서 정리를 한 내용들 입니다.

-참고 김영한 개발자님 : 인프런 - 자바 ORM 표준 JPA 프로그래밍


@OneToOne

일대일 관계는 그 반대도 일대일입니다.

일대일 관계는 특이하게 주 테이블이나 대상 테이블 중에 외래 키를 넣을 테이블을 선택 가능합니다.

  • 주 테이블에 외래 키 저장

  • 대상 테이블에 외래 키 저장

외래 키에 데이터베이스 유니크 제약조건 추가되어야 일대일 관계가 됩니다.

일대일 - 주 테이블에 외래 키 단방향

  • 회원이 딱 하나의 락커를 가지고 있는 상황으로 반대로 락커도 회원 한명만 할당 받을 수 있는 비즈니스 적인 룰이 있고, 이때, 둘의 관계는 일대일 관계입니다.

  • 이 경우 멤버를 주 테이블로 보고 주 테이블 또는 대상 테이블에 외래 키를 저장할 수 있습니다. (단, 유니크 제약조건을 추가한 상태)

  • 다대일[N:1] 단방향 관계 매핑과 JPA 어노테이션만 달라지고, 거의 유사합니다.

일대일 - 주 테이블에 외래 키 양방향

다대일[N:1] 양방향 매핑 처럼 외래키가 있는 곳이 연관관계의 주인입니다.

@OneToOne 어노테이션으로 일대일 단방향 관계를 매핑하고, @JoinColumn을 넣어줍니다.

@Entity
public class Member {
  ...
       
   @OneToOne
   @JoinColumn(name = "locker_id")
   private Locker locker;

  ...
}

반대편에 mappedBy를 적용시켜주지 않는다면 단방향 관계 매핑이고,

반대편에 mappedBy를 적용시켜주면 일대일 양방향 관계 매핑이 됩니다.

mappedBy = “locker” 는 Member엔티티에 있는 locker 필드와 매핑 되었다는 것을 의미합니다.

이 member 필드는 읽기 전용 필드입니다.

@Entity
public class Locker {
  ...
       
   @OneToOne(mappedBy = "locker")
   private Member member;
}

일대일 - 대상 테이블에 외래 키 단방향

일대일관계에서 대상 테이블에 외래 키를 저장하는 단방향 관계는 JPA에서 지원하지 않습니다.

일대일 - 대상 테이블에 외래 키 양방향

일대일 주 테이블에 외래 키 양방향 매핑을 반대로 뒤집었다고 생각하면 됩니다.