多对多关系正在创建一个我不想创建的新实例

问题描述

我有两个实体,即订单和产品,两者之间的关系是多对多的,我已经设置了关系,但是当我尝试使用现有产品集创建新订单时,它会使用新ID来创建新产品只是将他们加入Orders_Product。 最后,我提供了测试的屏幕截图。 这是我的订单的实体:

Program.cs

我的产品实体:

@Entity
@Table(name="Orders")
public class Orders implements Serializable {

@Id
@Column(name="idorder")
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator = "orders_sequence")
@SequenceGenerator(name = "orders_sequence")
private Long idOrder;


@Column(name="idclient")
private Long idClient;

@Column(name="idmanager")
private String idManager;


@Column(name="iddeliveryman")
private String idDeliveryMan;


@Column(name="dateorders")
@JsonFormat(pattern="mm-dd-yyyy")
private Date dateOrder;


@Column(name="totalprice")
private double totalPrice;

@ManyToMany(cascade = { CascadeType.ALL },fetch=FetchType.LAZY)
@JoinTable(
    name = "orders_products",joinColumns = { @JoinColumn(name = "idorder") },inverseJoinColumns = { @JoinColumn(name = "idproduct") }
)
private List<Products> products_orders ;

//getters and setters

我的订单控制器:

@Entity
@Table(name="Products")
public class Products implements Serializable{

@Id
@Column(name="idproduct")
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator = "products_sequence")
@SequenceGenerator(name = "products_sequence")
private Long idProduct;

@Column(name="labelproduct")
private String label;

@Column(name="priceproduct")
private int priceProduct;

@Column(name="descriptionproduct")
private String descriptionProduct;



@ManyToMany(mappedBy = "products" )
private List<Menu> menus;


@ManyToMany(mappedBy = "products_orders" )
private List<Orders> orders;

//getters and setters

Test in Postman

解决方法

您的关系不正确,您已经与@ManyToMany创建了订单Products关系,这在理论上是正确的,但是您需要与@OneToMany和{{1} }。

请记住,订单有其标语,它们并不是真正的产品,而应由其他实体代表。

产品是一种主数据,您可以对其进行一次设置并用于向用户建议菜单。您应该在订单行中对此进行参考,但是直接链接到Order会产生您遇到的问题。

产品应单独创建,而不要在系统中下订单。

因此,您必须在两者之间具有一个实体,如下所示:

Order_Products

我认为这是您所需要的,请阅读here

中的更多详细信息 ,

createOrder中,您收到一个类型为Orders的传入对象,该对象源自您所做的REST请求。如果您希望此新订单引用现有产品而不是新产品,则您必须从数据库加载现有产品,而不是让Hibernate将(非托管)Orders对象的持久化级联到其(非托管)Products个对象。

类似于

List<Products> products = new ArrayList<>();

for (Products p: order.getProducts_orders()) {
    products.add(productsRepos.findById(p.getId()));
    price = price + p.getPriceProduct();
}

order.setProducts(products);

编辑:如果默认情况下未将@ManyToMany关系设置为cascade = { CascadeType.ALL },这将立即显而易见,因为如果您保存Orders引用非托管{ {1}},您将从Hibernate中获得例外。