我正在尝试从组件内部删除并创建一个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,但即使这样也不行。
任何帮助都将不胜感激。