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{
}
我正在使用 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{
}