Контекст проблемы.В этом сценарии есть сущность 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.
Может ли кто-нибудь объяснить причину такого поведения?