Spring:在同一事务中执行delete和create,以便在其中任何一个失败时发生回滚

时间:2018-01-14 10:47:51

标签: java spring hibernate transactions

我正在尝试从组件内部删除并创建一个pojo。首先我执行删除,然后调用save再次创建它。问题是当保存失败时,删除不会被回滚。

@Transactional
public Item itemDeleteAndCreate(@NonNull Item itemToUpdate, Long itemId, @NonNull Item item) throws ParseException, IOException {
    item.setId(itemId);
//        validateSchema(item);
    mergeItemMandatoryAttr(item);
    validateAllMandatoryAttrPresent(item);
    validateStorageStrategy(item);
    Map<String, Object> exclusionTagsIfExist = exclusionRulesComponent.calculateExclusionTagsForProduct(item.getProductAttributes());
    Map<String, Object> itemAttribute = item.getProductAttributes();
    itemAttribute.put(EXCLUSION_TAGS, exclusionTagsIfExist);
    updateImageUrlWithImageData(item);
    log.info(String.format("Final item to be patched -> %s ", item.toString()));

    //ItemService itemService = new ItemService(itemBuilder);
    //return itemService.deleteAndCreate(itemToUpdate,item);
    itemBuilder.delete(itemToUpdate);
    Item updatedItem = itemBuilder.save(item);
    return updatedItem;
}

这是调用组件的控制器。

public class ItemController extends AbstractController<Item, Long> {
private final ItemComponent itemComponent;
private final ItemBuilder builder;

@Override
@RequestMapping(method = {RequestMethod.POST})
public ResponseEntity<?> save(@RequestBody @NonNull Item item,
                              @NonNull final HttpServletRequest request) {
    log.info("Received request to save " + item);

    try {
        Item savedItem = itemComponent.save(item, request);

从itemComponent.save中,itemDeleteAndCreate像这样被调用

Item updatedItem = itemDeleteAndCreate(itemToUpdate, itemId, item);

我已通过EnableTransactionManagement在配置中启用了事务。 我也尝试过AdviceMode.ASPECTJ模式,但即使这样也没有帮助。

此外,我尝试编写包装类并将此函数放入其中,然后创建该类的对象并在该对象上调用此函数。

Builder类最终调用了crudRepository的Dao,它的删除和保存功能也有一个事务注释。

从控制器调用此函数,该控制器上没有@transactional。

此外,我已经尝试过获得新的传播级别,但即使这样也没有用。

我也尝试过rollbackfor Exception.class,但即使这样也不行。

任何帮助都将不胜感激。

0 个答案:

没有答案