@OneToOne
- 1:1 관계를 맺어주는 역할을 하는 annotation
1:1에서 단방향 관계
- Entity에서 외래키의 주인은 일반적으로 N(다)의 관계인 Entity이지만 1:1관계에서는 외래 키의 주인을 직접 지정해야 함
- 외래키 주인만이 외래키를 등록, 수정, 삭제할 수 있고 주인이 아닌 쪽은 오직 외래키를 읽는 것만 가능함
- @JoinColumn()은 외래키 주인이 활용하는 annotation
- 컬럼명, null 여부, unique여부 등 지정 가능
설정 방법
- 외래 키의 주인만 상대 Entity 타입의 필드를 가지면서 @JoinColumn()을 활용하여 외래키의 속성을 설정해주면 됨
1:1에서 양방향 관계
- 외래키 주인을 지정해 줄 때 mappedBy 옵션 사용
- mappedBy의 속성값은 외래키의 주인인 상대 Entity의 필드명을 의미
설정 방법
- 단방향과 동일하게 외래키의 주인인 상대 Entity 타입의 필드를 가지면서 @JoinColumn()을 활용해 외래키의 속성을 설정해줌
- 단방향과 차이점은 상대 Entity는 외래 키의 주인 Entity 타입의 필드를 가지면서 mappedBy옵셥을 사용해 속성 값으로 외래키의 주인 Entity에 선언된 @JoinColumn()으로 설정되고 있는 필드명을 넣어주면 됨
❗이때
1. 외래키 주인 Entity에서 @JoinColumn()을 사용하지 않아도 default 옵션이 적용되지만 1:N 관계에서 외래 키의 주인 Entity가 @JoinColumn annotation을 생략한다면 JPA가 외래키를 저장할 컬럼을 파악할 수 없기 때문에 의도치 않은 중간 테이블이 생성됨 -> 외래키 주인 Entity 에서 @JoinColumn() 생략하지 말고 활용하기
- 양방향 관계에서 mappedBy 옵션을 생략할 경우 JPA가 외래키의 주인 Entity를 파악할 수가 없어서 의도치 않은 중간 테이블 생성됨 -> mappedBy 옵션 생략하지 말고 설정하기