我正在使用带有弹簧数据jpa和postgre的弹簧引导。我有"项目"实体,其中包含价格,数量,自动生成的int ID和它所属的订单。 我已经搜索了如何编辑该实体,仅更改其价格和数量,而无需创建新实体,我得到的唯一答案是从数据库中获取实体并将每个属性设置为新属性,然后保存它。但是,如果我有 6 个其他属性,除了价格和数量,这意味着在更新方法中,我将设置一个属性 8 次,在我看来,这似乎是 spring 的样板代码太多了。我的问题是:有没有更好/默认的方法可以做到这一点?
您可以提供一个复制构造函数:
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));
}
}
不,您无需设置 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 data rest,它自己处理所有这些。 您只需在指定的 URL 处调用补丁请求并提供更改的实体属性。 如果您对Spring Data REST有一些了解,请查看 https://github.com/ArslanAnjum/angularSpringApi。
只需在实体类中使用此@DynamicUpdate
@DynamicUpdate
public class Item{
}