Repository.deleteВсе не работает внутри транзакции с распространением REQUIRED и REQUIRED_NEW - PullRequest
0 голосов
/ 07 мая 2019

Контекст проблемы.В этом сценарии есть сущность Product и сущность ProductElement.Продукт может иметь несколько элементов-элементов.Я хочу удалить все существующие сущности ProductElement и сохранить все отредактированные сущности ProductElement.Для этого я использую следующий метод сервисного уровня.

@Transactional(propagation = Propagation.REQUIRED)
@Override
public boolean editProduct(ProductDto productDto) {
    Product product = productRepo.findByProductID(productDto.getProductID());

    List<ProductElement> existingProductElements = productElementRepo.findAllByProduct(product);
    productElementRepo.deleteAll(existingProductElements);

    List<ProductElement> productElements = new ArrayList<>();
    for(ProductElementDto productElementDto: productDto.getProductElementDtos()) {
        ProductElement productElement = new ProductElement(productElementDto);
        productElement.setProduct(product);
        productElements.add(productElement);
    }
    productElementRepo.saveAll(productElements);
    return true;

}

Проблема в том, что при использовании Propagation.REQUIRED или Propagation.REQUIRED_NEW вызывается deleteAll ( org.springframework.stereotype.Repository ) метод не влияет (то есть: у меня есть как предыдущий, так и новый ProductElements в базе данных).Но когда я использую Propagation.SUPPORTS, я получаю предпочтительное поведение (то есть: старые записи ProductElements удаляются, а новые добавляются в БД).

Я проверил SQL-запросы, которые выполняются.При использовании REQUIRED и REQUIRED_NEW запросы sql delete не отображаются, если в качестве SUPPORT используются запросы sql delete sql.

Может ли кто-нибудь объяснить причину такого поведения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...