问题描述
我有两个实体,即订单和产品,两者之间的关系是多对多的,我已经设置了关系,但是当我尝试使用现有产品集创建新订单时,它会使用新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
解决方法
您的关系不正确,您已经与@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中获得例外。