【发布时间】:2021-03-20 01:07:57
【问题描述】:
使用 Springboot 2.4.0,我正在尝试开发一个简单的模块来管理实体 Product 和 Order 之间的典型关系(ManyToMany 关系)。
按顺序,我有这个products 字段:
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(
name="products_orders",
joinColumns=@JoinColumn(name="order_id"),
inverseJoinColumns=@JoinColumn(name="product_id")
)
private List<Product> products;
因为我不需要它,所以现在我在 Product 实体中省略了 orders 字段。
在此关系之前,我有一个 Product 实体的 CRUD 并正常运行,因此我可以通过产品存储库插入产品:
public interface ProductRepository extends JpaRepository<Product, Integer>
我需要下订单,其中包含许多产品。我有这个代码:
List<Products> myListOfProducts = new ArrayList<>();
myListOfProducts.add(previouslyExistingProduct);
myListOfProducts.add(nonExistingProduct);
Order myorder = new Order(myListOfProducts, "mail", LocalDateTime.now());
myorder.save();
问题是:是否有可能使用以前的代码来保存新订单以及与之关联的产品(保存现有和非现有产品)?
这是订单库:
public interface OrderRepository extends JpaRepository<Order, Integer>
这是我目前得到的:
- 如果我将 CascadeType 更改为
CascadeType.MERGE,我只能将现有产品链接到新订单,但对于新产品,我会收到以下错误:
org.hibernate.TransientObjectException:对象引用了一个未保存的瞬态实例 - 在刷新之前保存瞬态实例:com.gallelloit.productcrud.model.Product;嵌套异常是 java.lang.IllegalStateException:org.hibernate.TransientObjectException:对象引用了一个未保存的瞬态实例 - 在刷新之前保存瞬态实例:com.gallelloit.productcrud.model.Product
- 我为 CascadeType 设置的任何其他值(包括
CascadeType.ALL)都得到相反的结果:新产品已保存并链接到新订单,但对于现有产品,我收到此错误:
传递给持久化的分离实体: com.galelloit.productcrud.model.Product;嵌套异常是 org.hibernate.PersistentObjectException:分离的实体传递给 坚持:com.gallelloit.productcrud.model.Product
我知道我可以“手动”获取每个产品,并将它们保存在 order.save() 之前,但我想知道 Spring Data 是否为您做到了。
有什么想法吗?
【问题讨论】:
标签: java spring-boot orm spring-data-jpa spring-data