在同一@Transaction JPA中保存和更新
我有一份销售产品清单,但具体如下: 顾客可以在两三天后退回一些产品。我也要在我的系统中执行这个操作 因此,我通过使用Spring引导和Spring数据向我的REST服务构建发送一个列表来更新sale的产品:列表的一个例子是在同一@Transaction JPA中保存和更新,jpa,spring-transactions,Jpa,Spring Transactions,我有一份销售产品清单,但具体如下: 顾客可以在两三天后退回一些产品。我也要在我的系统中执行这个操作 因此,我通过使用Spring引导和Spring数据向我的REST服务构建发送一个列表来更新sale的产品:列表的一个例子是 Sale: Products: 0: id: null description: 'Shirt' quantity: 2 removed: true 1: id: 1 descript
Sale:
Products:
0:
id: null
description: 'Shirt'
quantity: 2
removed: true
1:
id: 1
description: 'Shirt'
quantity: 1
removed: false
问题是:如何更新ID不为null的产品,并在同一事务中保存ID为null的产品?
当我尝试这样做时,我收到了错误:分离实体,在刷新它之前保持它。
我的方法有@Transaction from org.springframework.Transaction.annotation;
我可以先删除每一个产品,然后将列表全部插入,但逻辑上似乎是错误的
提前感谢在没有任何关于现有代码的信息的情况下,我只能为您提供最基本的解决方案,假设您直接使用的是基本的API,即
EntityManger
。这些代码看起来像:
@服务
公共类产品Prossor{
@持久上下文
私人实体;
@交易的
公共作废流程(列出产品DTO){
for(ProductDTO ProductDTO:productDTOs){
过程(productDTO);
}
}
私有作废流程(ProductDTO ProductDTO){
if(productDTO.getId()==null){
产品=新产品();
//从productDTO配置产品状态
....
em.persist(产品);
}否则{
Product Product=em.find(Product.class,productDTO.getId());
如果(产品==null){
抛出新的RuntimeException(String.format(“找不到ID为%s的产品。”,productDTO.getId());
}
//将产品状态从productDTO更新到
.....
}
}
}
ProductDTO
是表示RESTAPI请求有效负载的对象。另外,整个过程都在一个事务中,这意味着如果任何ProductDTO抛出异常都将导致所有事情回滚
如果您必须处理大量产品,还应注意防止OOM