Spring boot как редактировать сущность

Я использую весеннюю загрузку с данными весны jpa и postgre. У меня есть объект "item", который имеет цену, количество, автоматически сгенерированный int id и заказ, к которому он принадлежит. Я искал, как редактировать эту сущность, изменяя только ее цену и количество, без создания новой сущности, и единственный ответ, который я получил, - это получить сущность из БД и установить каждое свойство на новое, а затем сохранить его. Но если у меня есть 6 других свойств, кроме цены и количества, что означает, что в методе обновления я установлю свойство 8 раз, и мне кажется, что это слишком много стандартного кода для весны. Мой вопрос: есть ли лучший / стандартный способ сделать это?

4 ответа

Решение

Вы можете предоставить конструктор копирования:

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));
    }
}

Попробуйте использовать @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);

Просто используйте этот @DynamicUpdate в своем классе Entity

@DynamicUpdate
public class Item{
}

Нет, вам не нужно ничего устанавливать 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 запрос. И это все.

Вы должны использовать пружинный отдых данных, который обрабатывает все это сам по себе. вам просто нужно вызвать запрос на исправление по указанному URL и предоставить измененные свойства объекта. Если у вас есть некоторые знания о данных по весне, посмотрите https://github.com/ArslanAnjum/angularSpringApi.

Другие вопросы по тегам