簡體   English   中英

Spring boot 如何編輯實體

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM