Сохранить и обновить в том же JPA @Transaction - PullRequest
0 голосов
/ 22 февраля 2020

У меня есть список продуктов продаж, но дело в том, что клиент может вернуть некоторые продукты через два или три дня. Я должен выполнить эту операцию и в моей системе.

Поэтому я обновляю продукты продажи, отправляя список в свою сборку службы REST с использованием Spring Boot и Spring Data: Одним из примеров списка будет

Sale:
 Products:
    0: 
      id: null
      description: 'Shirt'
      quantity: 2
      removed: true
    1:
      id: 1
      description: 'Shirt'
      quantity: 1
      removed: false

Вещи: Как я могу обновить продукт, чей идентификатор не равен нулю, и сохранить тот, чей идентификатор равен нулю, в той же транзакции? Когда я пытаюсь это сделать, я получаю сообщение об ошибке: отсоединенный объект, сохраните его, прежде чем сбросить. Мой метод имеет @Transaction из org.springframework.transaction.annotation; Я мог бы сначала удалить каждый продукт, а затем вставить весь список, но это кажется логически неправильным

Спасибо в авансовый

1 Ответ

0 голосов
/ 22 февраля 2020

Без какой-либо информации о том, как выглядят ваши существующие коды, я мог бы дать вам только самое фундаментальное решение, предполагающее, что вы используете фундаментальный API, который является EntityManger напрямую. Коды выглядят примерно так:

@Service
public class ProductProssor {

    @PersistenceContext
    private EntityManger em;


    @Transactional
    public void process(List<ProductDTO> productDTOs){

        for(ProductDTO productDTO : productDTOs){
            process(productDTO);
        }
    }


    private void process(ProductDTO productDTO){

        if(productDTO.getId() == null){
            Product product = new Product();
            //configure the product state from productDTO
            ....

            em.persist(product);
        }else{
            Product product = em.find(Product.class, productDTO.getId());
            if(product == null){
                throw new RuntimeException(String.format("Product with this ID %s cannot be found.", productDTO.getId()));
            }

            //update your product state from productDTO
           .....
        }

    }

}

ProductDTO - это объект, представляющий полезную нагрузку запроса REST API. Кроме того, весь процесс выполняется в одной транзакции, что означает, что любое из исключений выброса ProductDTO вызовет откат всех вещей.

Также см. this , чтобы предотвратить OOM, если вам придется обрабатывать много продукта.

...