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관계
반응형