Spring 25. 1:1

김창민·2024년 8월 20일

BE

목록 보기
46/50

@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;
}
profile
일일 회고 : https://rlackdals981010.github.io/

0개의 댓글