본문 바로가기

Language/Java, Android

[JPA] @OneToOne, 일대일[1:1] 관계

 

 

일대일 [1:1]

  • 일대일 관계는 그 반대도 일대일이다.
  • 일대일 관계는 특이하게 주 테이블이나 대상 테이블 중에 외래 키를 넣을 테이블을 선택 가능하다.
    • 주 테이블에 외래 키 저장
    • 대상 테이블에 외래 키 저장
  • 외래 키에 데이터베이스 유니크 제약조건 추가되어야 일대일 관계가 된다.

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

  • 회원이 딱 하나의 락커를 가지고 있는 상황이다. 반대로 락커도 회원 한명만 할당 받을 수 있는 비즈니스 적인 룰이 있고, 이때, 둘의 관계는 일대일 관계이다.
  • 이 경우 멤버를 주 테이블로 보고 주 테이블 또는 대상 테이블에 외래 키를 저장할 수 있다. 단, 유니크 제약조건을 추가한 상태에서만.
  • 다대일[N:1] 단방향 관계 매핑과 JPA 어노테이션만 달라지고, 거의 유사하다.

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

  • 다대일[N:1] 양방향 매핑 처럼 외래키가 있는 곳이 연관관계의 주인이다.
  • JPA @OneToOne 어노테이션으로 일대일 단방향 관계를 매핑하고, @JoinColumn을 넣어준다.
    • @JoinColumn은 Default 값이 있긴 하지만 지저분하게 들어간다. name을 정해주자.
    • 여기까지만 매핑하면 단방향 관계이고@Entity
      public class Member {
        ...
             
         @OneToOne
         @JoinColumn(name = "locker_id")
         private Locker locker;

        ...
      }
  • 반대편에 mappedBy를 적용시켜주면 일대일 양방향 관계 매핑이 된다.
    • mappedBy = "locker" 는 Member엔티티에 있는 Locker 필드와 매핑 되었다는 것을 의미.
    • 이 member 필드는 읽기 전용 필드이다.@Entity
      public class Locker {
        ...
             
         @OneToOne(mappedBy = "locker")
         private Member member;
      }

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

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

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

  • 일대일 주 테이블에 외래 키 양방향 매핑을 반대로 뒤집었다고 생각하면 된다. 매핑 방법은 같다.
  • 주 테이블은 멤버 테이블이지만, 외래 키를 대상 테이블에서 관리하고 주 테이블의 락커 필드는 읽기 전용이 된다.

정리

  • 주 테이블에 외래 키
    • (주 테이블 : 많이 접근하는 테이블)
    • 주 객체(많이 사용하는 객체)가 대상 객체의 참조를 가지는 것 처럼
    • 주 테이블에 외래 키를 두고 대상 테이블을 찾는 방식.
    • 객체지향 개발자들이 선호하고, JPA 매핑이 편리하다.
    • 장점
      • 주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인이 가능하다.
    • 단점
      • 값이 없으면 외래 키에 NULL을 허용해야 한다. DB입장에서는 치명적일 수 있다.
  • 대상 테이블에 외래키

Reference



출처: https://ict-nroo.tistory.com/126 [개발자의 기록습관]

 

[JPA] @OneToOne, 일대일[1:1] 관계

일대일 [1:1] 일대일 관계는 그 반대도 일대일이다. 일대일 관계는 특이하게 주 테이블이나 대상 테이블 중에 외래 키를 넣을 테이블을 선택 가능하다. 주 테이블에 외래 키 저장 대상 테이블에

ict-nroo.tistory.com