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 @OneToMany 단방향, 양방향 정리 본문

Spring

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

H.S-Backend 2024. 5. 28. 21:00

@OneToMany = 1 대 N 관계

 

단방향 관계에서

외래키를 관리하는 주인은 음식 Entity이지만

실제 외래키는 고객 Entity가 갖고있다.

 

1:N에서 N관계의 테이블이 외래키를 가질 수 있기에

외래키는 N관계 users테이블에 외래키 컬럼을

만들어 추가하지만 

외래 키의 주인인 음식Entity를 통해 관리한다.

 

간단히 말하자면

음식(외래키)은 하나인데 고객이 여러명이 주문을했다면(N)

음식하나에 고객주문 여러명의 정보를 출력할 수 있다.

1 : N 관계

 

그래서 Food가 외래키(1)이라면

실제 주문 1의 외래키는 Food테이블에서 관리하고

users에서 외래키를 담당하는것은

고객 100명이면 외래키 100개까지 있는것이다.

 

하지만

고객정보 users(N)에서 개개인을 하나씩 조회하는것보다

Food는 한가지이기에 

Food의 외래키로 User를 List화 시켜

출력을 하는것이다. 

 

본론은 
Food(1)가 외래키 고객(N)을 관리한다
@Table(name = "food")
public class Food {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;

    @OneToMany
    @JoinColumn(name = "food_id") // users 테이블에 food_id 컬럼
    private List<User> userList = new ArrayList<>();
}
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

}

양방향 관계

1 대 N관계에서는 일반적 양방향 관계가 존재하지 않는다

 

1대 N관계에서 양방향 관계를 맺으려면 

음식Entity를 외래키의 주인으로 정해주기 위해서

고객 entity에서 mappedBy옵션을 사용해야 하지만

결국 @ManyToOne과 @OneToMany 에너테이션은 mappedBy속성을 제공하지 않는다.

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

    @ManyToOne
    @JoinColumn(name = "food_id", insertable = false, updatable = false)
    private Food food;
}

N관계의 Entity인 고객 Entity에서

@JoinColum의

insertable과 updatable 옵션을 false로 설정하여

양쪽으로 JOIN 설정을하면 양방향 처럼 사용할 수 있다.

 

왜냐면 주문할 음식은 하나인데 양방향으로 진행한다면

주문정보가 업데이트 된다면 ? 

고객정보안에있는 음식주문정보를 100개 다 수정해야된다.

반응형