Как работать со связью ManyToMany в Spring-проекте?
Есть небольшой Spring-проект с классами Order и Dish, Заказ и Блюдо соответственно. Есть база данных PostgreSQL, где соответственно у меня есть таблица для класса Заказ и Блюдо. В какой-то момент мне понадобилось, чтобы в Заказе у покупателя была возможность покупать несколько Блюд. Мне посоветовали для реализации этой мысли использовать связь Многие ко многим. Я пошел в БД, создал третью таблицу и, как мне кажется, создал связь из двух таблиц многие ко многим. Вот код по которому я реализовал связь:
create table order_dish(order_id int references pg_order (id)
on update cascade on delete cascade,
dish_id int references dish(id)
on update cascade, constraint order_dish_pkey primary key
(order_id, dish_id));
Затем я перешел в сам код проекта, и стал расписывать аннотации @Column, @ManyToMany, @Table и т.д. В классе Блюда(Dish) выдает ошибку 'Many To Many' attribute type should be a container. Подскажите пожалуйста, верно ли я все делаю и в чем может быть моя ошибка?
Класс Order:
package com.tinychiefdelights.model;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import lombok.Data;
import javax.persistence.*;
import java.util.Date;
import java.util.List;
@Data
@Entity
@Table(name = "pg_order", schema = "public")
public class Order {
public Order(){ // Пустой конструктор для Hibernate
}
public Order(/*Customer customer,*/ String address,
String phoneNumber, Date dateOrder, /* Cook cook,*/
List<Dish> dishes, boolean orderStatus) { // Базовый конструктор
// this.customer = customer;
this.address = address;
this.phoneNumber= phoneNumber;
this.dateOrder = dateOrder;
// this.cook = cook;
this.dishes = dishes;
this.orderStatus = orderStatus;
}
// Поля
private @Id @GeneratedValue Long id;
// @ManyToOne(fetch= FetchType.LAZY, cascade= CascadeType.ALL)
// @JsonBackReference
// private Customer customer;
@Column(name = "address")
private String address;
@Column(name = "phone_number")
private String phoneNumber;
@Column(name = "date_order")
private Date dateOrder;
// @ManyToOne(fetch= FetchType.LAZY, cascade= CascadeType.ALL)
// @JsonBackReference
// private Cook cook;
@ManyToMany(mappedBy = "order", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JsonManagedReference
private List<Dish> dishes;
@Column(name = "order_status")
private boolean orderStatus;
}
Класс Dish:
package com.tinychiefdelights.model;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import lombok.Data;
import javax.persistence.*;
import java.util.List;
@Data
@Entity
public class Dish {
public Dish(){ // Пустой конструктор для Hibernate
}
public Dish(String dishName, double dishCost/*, List<Cook> cookList*/,
short weight, short cookingTime, String aboutDish) { // Базовый конструктор
this.dishName = dishName;
this.dishCost = dishCost;
// this.cookList = cookList;
this.weight = weight;
this.cookingTime = cookingTime;
this.aboutDish = aboutDish;
}
// Поля
private @Id @GeneratedValue Long id;
@Column(name = "name")
private String dishName;
@Column(name = "dish_cost")
private double dishCost;
// @OneToMany(mappedBy = "dish", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
// @JsonManagedReference
// private List<Cook> cookList;
@Column(name = "weight")
private short weight;
@Column(name = "cooking_time")
private short cookingTime;
@Column(name = "about_dish")
private String aboutDish;
@ManyToMany(fetch= FetchType.LAZY, cascade= CascadeType.ALL)
@JsonBackReference
private Order order; // ВЫДАЕТ ОШИБКУ 'Many To Many' attribute type should be a container!!!!!!!
}
Схема базы данных:
Ответы (1 шт):
Order тоже должен быть списком, раз @ManyToMany связь:
@ManyToMany(mappedBy = "dishes", fetch= FetchType.LAZY, cascade= CascadeType.ALL)
private List<Order> ordersList;
