Без какой-либо информации о том, как выглядят ваши существующие коды, я мог бы дать вам только самое фундаментальное решение, предполагающее, что вы используете фундаментальный 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, если вам придется обрабатывать много продукта.