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.