@OneToOne
@OneToOne
애너테이션은 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() 애너테이션을 활용하는 것이 👍🏻
- 양방향 관계에서 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; }