1대 1 관계

금은체리·2023년 11월 17일
0

Spring

목록 보기
29/49

@OneToOne

  • @OneToOne 애너테이션은 1 대 1 관계를 맺어주는 역할
    • 고객 Entity와 음식 Entity가 1 대 1 관계라 가정

단방향 관계

  • 외래키의 주인 정하기
    • Entity에서 외래키의 주인은 일반적으로 N(다)의 관계인 Entity이지만 1 대 1 관계에서는 외래키의 주인을 직접 지정해야함
      외래키 주인만이 외래키를 등록, 수정, 삭제 가능
      주인이 아닌 쪽은 외리 키를 읽는 것만 가능
    • @JoinColumn()은 외래키의 주인이 활용하는 애너테이션
      * 컬럼명, null 여부, unique 여부 등 지정 가능
      • 음식 Entity가 외래키의 주인인 경우

        • 음식

          @Entity
          @Table(name = "food")
          public class Food {
              @Id
              @GeneratedValue(strategy = GenerationType.IDENTITY)
              private Long id;
              private String name;
              private double price;
          
              @OneToOne
              @JoinColumn(name = "user_id")
              private User user;
          }
        • 고객

          @Entity
          @Table(name = "users")
          public class User {
              @Id
              @GeneratedValue(strategy = GenerationType.IDENTITY)
              private Long id;
              private String name;
          }

      • 고객 Entity가 외래 키의 주인인 경우

        • 음식

          @Entity
          @Table(name = "food")
          public class Food {
              @Id
              @GeneratedValue(strategy = GenerationType.IDENTITY)
              private Long id;
              private String name;
              private double price;
          }
        • 고객

          @Entity
          @Table(name = "users")
          public class User {
              @Id
              @GeneratedValue(strategy = GenerationType.IDENTITY)
              private Long id;
              private String name;
          
              @OneToOne
              @JoinColumn(name = "food_id")
              private Food food;
          }

양방향 관계

  • 양방향 관계에서 외래키의 주인을 지정해 줄 때 mappedBy 옵션 사용
    • mappedBy의 속성값은 외래키의 주인인 상대 Entity의 필드명을 의미
  • 관계 설정 방법
    • 단방향
      • 외래키의 주인만 상대 Entity타입의 필드를 가지면서 @JoinColumn()을 활용하여 외래키의 속성 설정
    • 양방향
      • 외래키의 주인은 상대 Entity 타입의 필드를 가지면서 @JoinColumn()을 활용하여 외래키의 속성 설정
      • 상대 Entity는 외래키의 주인 Entity타입의 필드를 가지면서 mappedBy 옵션을 사용하여
      • 속성 값으로 외래키의 주인 Entity에 선언된 @JoinColumn()으로 설정되고 있는 필드명을 넣어주면 됨

👀
1. 외래키의 주인 Entity에서 @JoinColumn() 애너테이션을 사용하지 않아도 default 옵션이 적용되기 때문에 생략 가능

  • 다만 1대 N관계에서 외래키의 주인 Entityrk @JoinColumn() 애너테이션을 생략한다면
  • JPA가 외래키를 저장할 칼럼을 파악할 수 없어서 의도하지 않은 중간 테이블이 생성됨
  • 따라서 외래키의 주인 Entity에서 @JoinColumn() 애너테이션을 활용하는 것이 👍🏻
  1. 양방향 관계에서 mappedBy 옵션을 생략할 경우 JPA가 외래키의 주인 Entity를 파악할 수가 없어 의도하지 않은 중간테이블이 생성되기 때문에 반드시 설정하자!
음식 Entity가 외래키의 주인인 경우
  • 음식
@Entity
@Table(name = "food")
public class Food {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;

    @OneToOne
    @JoinColumn(name = "user_id")
    private User user;
}
  • 고객
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @OneToOne(mappedBy = "user")
    private Food food;
}
  • @OneToOne(mappedBy = "user")는 [음식]의 user를 뜻 함
    ➡️ private User user;
고객 Entity가 외래키의 주인인 경우
  • 음식
@Entity
@Table(name = "food")
public class Food {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;

    @OneToOne(mappedBy = "food")
    private User user;
}
  • 고객
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @OneToOne
    @JoinColumn(name = "food_id")
    private Food food;
}
profile
전 체리 알러지가 있어요!

0개의 댓글