@OneToOne 어노테이션은 1대1 관계를 맺어준다.
외래 키의 주인 정하기
보통 1:N 관계에서는 N의 관계인 Entity가 외래 키의 주인이지만, 1:1 에서는 직접 지정해야한다.
주인이 외래 키를 등록, 수정, 삭제가 가능하며, 아닌쪽은 읽기만 가능하다.
외래 키의 주인 Entity는 @JoinColumn()을 통해 외래 키를 지정할 수 있다.
여기서 컬럼명, null 여부, unique등 옵션 설정이 가능하다.
@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는 위처럼 관계 - 외래 키 지정을 통해 다른 Entity 타입을 필드로 갖는다.
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
아닌 Entity는 이렇게 그냥 아무것도 없다.
만약 Food말고 User를 외래 키의 주인으로 하고 싶다면,
@OneToOne
@JoinColumn(name = "food_id")
private Food food;
를 User에 추가하고, Food의 해당 부분은 삭제하면 된다.
양방향 관계에서는 외래 키의 주인을 지정할 때 mappedBy 옵션을 사용한다.
mappedBy의 속성값은 외래 키의 주인 Entity의 필드명을 사용한다.
단 방향의 경우 위에서 말한대로 다른 Entity의 타입을 필드로 갖고 @JoinColumn()을 사용하고,
양 방향의 경우 주인은 단방향과 동일하되, 비주인 Entity는 주인 Entity 타입의 필드를 선언하고 mappedBy 옵션을 통해
주인 Entity의 JoinColumn으로 설정된 필드명을 사용하면 된다.
@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;
}