Java Spring boot如何编辑实体

Java Spring boot如何编辑实体,java,spring,entity,spring-data-jpa,spring-rest,Java,Spring,Entity,Spring Data Jpa,Spring Rest,我使用的是spring boot和spring数据jpa和postgre。我有一个“项目”实体,它有价格、数量、自动生成的int id和它所属的订单。 我搜索了如何编辑该实体,只更改其价格和数量,而不创建新实体,我得到的唯一答案是从数据库中获取实体,并将每个属性设置为新属性,然后保存它。但是,如果我有6个其他属性,除了价格和数量,这意味着在更新方法中,我将设置一个属性8次,在我看来,这似乎太多了spring的样板代码。我的问题是:有没有更好的/默认的方法来做到这一点 不,您不需要将任何内容设置为

我使用的是spring boot和spring数据jpa和postgre。我有一个“项目”实体,它有价格、数量、自动生成的int id和它所属的订单。
我搜索了如何编辑该实体,只更改其价格和数量,而不创建新实体,我得到的唯一答案是从数据库中获取实体,并将每个属性设置为新属性,然后保存它。但是,如果我有6个其他属性,除了价格和数量,这意味着在更新方法中,我将设置一个属性8次,在我看来,这似乎太多了spring的样板代码。我的问题是:有没有更好的/默认的方法来做到这一点

不,您不需要将任何内容设置为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);

您应该使用SpringDataREST,它自己处理所有这些。您只需在指定的URL上调用修补程序请求并提供更改的实体属性。如果您对spring数据rest有一些了解,请看一看

您可以提供:

或者使用
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));
    }
}
@RestController
@请求映射(“/items”)
公共类ItemController{
@自动软件
私人项目回购;
@PutMapping(“/{id}”)
公共响应属性更新(@PathVariable(“id”)项目标项,@RequestBody项源项){
copyProperties(sourceItem,targetItem,“id”);
返回ResponseEntity.ok(repo.save(targetItem));
}
}

只需在实体类中使用此@DynamicUpdate即可

@DynamicUpdate
public class Item{
}

我看不到完美的解决方案,从存储库或服务中检索条目进行更改并调用save。我想我的问题还不清楚。我知道如果我只想更改价格和数量,我会更改(设置)价格和数量,但如果我想更新的下一个实体有5个属性(比如价格、数量、颜色、材料、发货人),我必须调用实体。价格=新价格;entitiy.quantity=新数量;entity.color=newColor;等等这正是我想要逃避的:)这颗豆芽似乎就是我正在寻找的东西。非常感谢@Cerp0我向上投票给你,但我没有足够的评分,所以它没有显示我的投票:)但我选择了你作为最佳答案,至少显示:)谢谢你的反馈!声誉低于15的人所投的票会被记录下来,但不会改变公开显示的帖子分数。@TodorAtanasov这不是问题,只是提醒一下而已。)
@DynamicUpdate
public class Item{
}