Spring 引导如何编辑实体

Spring boot how to edit entity

我正在使用 spring 引导和 spring 数据 jpa 和 postgre。我有 "item" 个实体,它具有价格、数量、自动生成的 int id 和它所属的订单。 我搜索了如何编辑该实体,仅更改其价格和数量,而不创建新实体,我得到的唯一答案是从数据库中获取实体并将每个 属性 设置为新实体,然后保存它。但是,如果我有 6 个除价格和数量之外的其他属性,这意味着在更新方法中我将设置 属性 8 次,在我看来,spring 的样板代码太多了。我的问题是:有 better/default 的方法吗?

不需要,8次不需要设置任何东西。如果只想更改价格和数量,只需更改这两个即可。将它放在@Transactional 方法中:

@Transactional
public void updateItem(Item item){
    // ....
    // EntityManager em;
    // ....

    // Get 'item' into 'managed' state
    if(!em.contains(item)){
        item = em.merge(item);
    }

    item.price = newPrice;
    item.quantity = newQuantity;
    // You don't even need to call save(), JPA provider/Hibernate will do it automatically.
}

此示例将生成一个 SELECT 和一个 UPDATE 查询。仅此而已。

尝试使用 @Query 注释并定义您的 update 语句

 @Modifying
 @Transactional
 @Query("update Site site set site.name=:name where site.id=:id")
 void updateJustNameById(@Param("id")Long id, @Param("name")String name);

您应该使用 spring 数据休息,它会自行处理所有这些。您只需在指定的 URL 调用补丁请求并提供更改后的实体属性。如果您对 spring 数据有一些了解,请查看 https://github.com/ArslanAnjum/angularSpringApi

你可以提供一个copy constructor:

public Item(Item item) {
    this(item.price, item.quantity); 
}

或使用org.springframework.beans.BeanUtils方法:

BeanUtils.copyProperties(sourceItem, targetItem, "id"); 

然后在控制器中:

@RestController
@RequestMapping("/items")
public class ItemController {

    @Autoware
    private ItemRepo repo;

    @PutMapping("/{id}")
    public ResponseEntity<?> update(@PathVariable("id") Item targetItem,  @RequestBody Item sourceItem) {
        BeanUtils.copyProperties(sourceItem, targetItem, "id");
        return ResponseEntity.ok(repo.save(targetItem));
    }
}

只需在您的实体中使用此@DynamicUpdate class

@DynamicUpdate
public class Item{
}