Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在同一@Transaction JPA中保存和更新_Jpa_Spring Transactions - Fatal编程技术网

在同一@Transaction JPA中保存和更新

在同一@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

我有一份销售产品清单,但具体如下: 顾客可以在两三天后退回一些产品。我也要在我的系统中执行这个操作

因此,我通过使用Spring引导和Spring数据向我的REST服务构建发送一个列表来更新sale的产品:列表的一个例子是

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