[英]Spring boot how to edit entity
我正在使用帶有 spring 數據 jpa 和 postgre 的 spring boot。 我有“項目”實體,它具有價格、數量、自動生成的 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 數據休息有一些了解,請查看https://github.com/ArslanAnjum/angularSpringApi 。
只需在您的實體類中使用此 @DynamicUpdate
@DynamicUpdate
public class Item{
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.