JPA: операция обновления без запроса JPA или entitymanager - PullRequest
0 голосов
/ 25 мая 2020

Я изучаю JPA, я обнаружил, что у нас есть некоторые функции, которые уже присутствуют в Jparepository, такие как save, saveAll, find, findAll и т. Д. c. но нет ничего похожего на обновление,

Я столкнулся с одним сценарием, когда мне нужно обновить таблицу, если значение уже присутствует, в противном случае мне нужно вставить запись в таблицу.

Я создал

@Repository
public interface ProductInfoRepository
    extends JpaRepository<ProductInfoTable, String>
{
    Optional<ProductInfoTable> findByProductName(String productname);
}

public class ProductServiceImpl
    implements ProductService
{
    @Autowired
    private ProductInfoRepository productRepository;

    @Override
    public ResponseMessage saveProductDetail(ProductInfo productInfo)
    {
        Optional<ProductInfoTable> productInfoinTable =
            productRepository.findByProductName(productInfo.getProductName());
        ProductInfoTable productInfoDetail;
        Integer quantity = productInfo.getQuantity();
        if (productInfoinTable.isPresent())
        {
            quantity += productInfoinTable.get().getQuantity();
        }
        productInfoDetail =
            new ProductInfoTable(productInfo.getProductName(), quantity + productInfo.getQuantity(),
                                 productInfo.getImage());
        productRepository.save(productInfoDetail);
        return new ResponseMessage("product saved successfully");
    }
}

как вы можете видеть, я могу сохранить запись, если запись новая, но когда я пытаюсь сохранить запись, которая уже присутствует в таблице, это дает мне ошибку, связанную с нарушением первичного ключа, которое очевидно. Я несколько раз проверил, мы можем выполнить обновление, создав объект entitymanager или запрос jpa, но что, если я не хочу использовать их оба. есть ли другой способ сделать это?

update Я также добавил экземпляр EntityManager и попытался объединить код

 @Override
    public ResponseMessage saveProductDetail(ProductInfo productInfo)
    {
        Optional<ProductInfoTable> productInfoinTable =
            productRepository.findByProductName(productInfo.getProductName());
        ProductInfoTable productInfoDetail;
        Integer price = productInfo.getPrice();
        if (productInfoinTable.isPresent())
        {
            price = productInfoinTable.get().getPrice();
        }
        productInfoDetail =
            new ProductInfoTable(productInfo.getProductName(), price, productInfo.getImage());
        em.merge(productInfoDetail);
        return new ResponseMessage("product saved successfully");

, но без ошибок, без выполнения операторов обновления в журнале , какие-либо возможные причины для этого? }

1 Ответ

2 голосов
/ 25 мая 2020

Я подозреваю, что вам нужен такой код для решения проблемы

public ResponseMessage saveProductDetail(ProductInfo productInfo)
    {
        Optional<ProductInfoTable> productInfoinTable =
            productRepository.findByProductName(productInfo.getProductName());

        final ProductInfoTable productInfoDetail;
        if (productInfoinTable.isPresent()) {
            // to edit
            productInfoDetail = productInfoinTable.get();
            Integer quantity = productInfoDetail.getQuantity() + productInfo.getQuantity();
            productInfoDetail.setQuantity(quantity);
        } else {
            // to create new
            productInfoDetail = new ProductInfoTable(productInfo.getProductName(), 
                productInfo.getQuantity(), productInfo.getImage());
        }

        productRepository.save(productInfoDetail);
        return new ResponseMessage("product saved successfully");
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...