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 @ManyToMany와 중간테이블 본문

Spring

스파르타 부트캠프 Spring Master 3강 Entity @ManyToMany와 중간테이블

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

@ManyToMany

에너테이션은 N대 M관계를 맺어주는 역할을 한다.

 

 

단방향 관계

음식 Entity가 외래키의 주인이다.

N:M관계를 풀어내기 위해서

중간 테이블 (orders)을 생성하여 사용한다.

import jakarta.persistence.*;

import java.util.ArrayList;

@Entity
@Table(name = "food")
public class Food {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;

    @ManyToMany
    @JoinTable(name = "orders", // 중간 테이블 생성
            joinColumns = @JoinColumn(name = "food_id"), // 현재 위치인 Food Entity 에서 중간 테이블로 조인할 컬럼 설정
            inverseJoinColumns = @JoinColumn(name = "user_id")) // 반대 위치인 User Entity 에서 중간 테이블로 조인할 컬럼 설정
    private List<User> userList = new ArrayList<>();
}
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
}

 

생성되는 중간 테이블을 컨트롤하기 어렵기 때문에

추후에

중간 테이블의 변경이 발생할 경우 문제가 발생할 가능성이 있다.

 

내가 생성한 것이 아니기때문에 필드자체에 무엇이 정의되있는지 알 수가 없다.

 


 

양방향 관계

 

음식Entity가 외래키의 주인

import jakarta.persistence.*;

import java.util.ArrayList;

@Entity
@Table(name = "food")
public class Food {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;

    @ManyToMany
    @JoinTable(name = "orders", // 중간 테이블 생성
            joinColumns = @JoinColumn(name = "food_id"), // 현재 위치인 Food Entity 에서 중간 테이블로 조인할 컬럼 설정
            inverseJoinColumns = @JoinColumn(name = "user_id")) // 반대 위치인 User Entity 에서 중간 테이블로 조인할 컬럼 설정
    private List<User> userList = new ArrayList<>();
}
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @ManyToMany(mappedBy = "userList")
    private List<Food> foodList = new ArrayList<>();
}

 

반대 방향인 고객 Entity

@ManyToMany로 음식 Entity를 연결하고 mappedBy옵션을 설정하여

외래키의 주인을 설정하면 양방향 관계 맺음이 가능하다.

 


 

중간 테이블 생성

 

중간 테이블 order를 직접 생성하여 관리하면

변경 발생시 컨트롤 하기 쉽기에 확정성에 좋다.

@Table(name = "food")
public class Food {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;

    @OneToMany(mappedBy = "food")
    private List<Order> orderList = new ArrayList<>();
}
@Table(name = "orders")
@EntityListeners(AuditingEntityListener.class)
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "food_id")
    private Food food;

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

    @CreatedDate
    @Temporal(TemporalType.TIMESTAMP)
    private LocalDateTime orderDate;
}
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @OneToMany(mappedBy = "user")
    private List<Order> orderList = new ArrayList<>();
}

 

중간테이블에서 외래키를 갖고 있으며

Food와 User는 각각 @OneToMany 어노테이션을 사용하여 

 

중간테이블(Order)에서 

 

Food id 가 1이면

Food id 1을 주문한 고객정보들을 출력할 수 있게하고

User Id 가 1이면

주문한 Food 목록들을 출력할 수 있게 한다.

 

결론 

M : M관계

 

반응형