Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags more
Archives
Today
Total
관리 메뉴

요리사에서 IT개발자로

스파르타 부트캠프 Spring Master 3강 Entity @OneToOne 단방향, 양방향 정리 본문

Spring

스파르타 부트캠프 Spring Master 3강 Entity @OneToOne 단방향, 양방향 정리

H.S-Backend 2024. 5. 28. 20:06

1대 1관계 

@OneToOne (1대 1 관계를 맺어주는 역할)

 

 

Entity에서 외래키의 주인

일반적으로 N(다수)의 관계 Entity이지만 

 

1대1관계 에서는 외래키의 주인을 직접 지정해야한다.

 

외래키를 가지고있는 클래스만이

외래키를 등록, 수정, 삭제할 수 있고

 

아닌쪽은 읽는 것만 가능하다.


@JoinColumn()

외래 키의 주인이 활용하는 에너테이션이다.

컬럼명, Null여부, Unique여부 등 지정할 수 있다.
@OneToOne
@JoinColumn(name = "user_id")
private User user;

 


 

Food Entity가 외래키의 주인인 경우

@Entity
@Getter
@Setter
@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
@Getter
@Setter
@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;
}
import jakarta.persistence.*;

@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;
}

 

@OneToOne 에너테이션 밑에

@JoinColumn을 가지고 외래키의 주인이 활용하는 에너테이션

 


양방향 관계

외래키 지정시 mappedBy 옵션을 사용한다.

외래키의 주인인 상대 Entity필드명을 의미한다


관계 설정 방법

 

단방향은

외래 키의 주인

상대 Entity 타입의 필드를 가지며

JoinColumn()을 활용하여 외래키 속성을 설정해준다.

@OneToOne
@JoinColumn(name = "user_id")
private User user;

양방향은

 외래키의 주인

상대 Entity 타입의 필드를 가지면서

JoinColumn()을 활용하여 외래 키의 속성을 설정해준다.

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 타입의 필드를 가지면서 

mappedBy 옵션을 사용하여 속성 값으로 

외래 키의 주인 Entity에 선언된

JoinColumn()으로 설정되고 있는 필드명을 넣어주면된다.

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

    @OneToOne(mappedBy = "user")
    private Food food;

 


 

외래키의 주인 Entity에서 @JoinColumn()은 default옵션으로 생략이 가능하다

 

하지만 1대 N 관계에서는 JoinColumn을 생략하면

중간테이블이 생성된다.

똑같이 양방향 관계에서 mappedBy옵션을 생략하면

중간테이블이 설정된다.

 

Jpa가 외래키를 찾을 수 없기에 기본으로 생성해두자

 


 

음식 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 양방향

@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;
}
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @OneToOne(mappedBy = "user")
    private Food food;

    public void addFood(Food food) {
        this.food = food;
        food.setUser(this);
    }

 

양방향에서

Food테이블이 외래키를 기본적으로 갖고 있으며 

maapedBy를 사용하여 user필드를 가져와서 양방향이 되고

 

User 클래스에서

addFood 클래스를 생성하여

food.setUser를 사용하여 (this = User를 지칭)

함으로

User에서도 Food를 가져올 수 있게 할 수 있다.

 

 

 

반응형