Java Spring boot如何编辑实体
我使用的是spring boot和spring数据jpa和postgre。我有一个“项目”实体,它有价格、数量、自动生成的int id和它所属的订单。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的样板代码。我的问题是:有没有更好的/默认的方法来做到这一点 不,您不需要将任何内容设置为
我搜索了如何编辑该实体,只更改其价格和数量,而不创建新实体,我得到的唯一答案是从数据库中获取实体,并将每个属性设置为新属性,然后保存它。但是,如果我有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{
}