是否有任何解决方案可以通过在具体方法的抽象 Class 中定义来处理事务?

Is there any solution to handle Transactional by defining in Abstract Class of Concrete Method?

我正在我的应用程序中定义事务函数,但它不适用于具体方法的抽象 class,因为我的控制器首先调用抽象 class 方法,然后它将进入具体 class 方法。谁能帮我解决?我尝试使用具体的 class 方法,它的工作原理,但我需要将它带到抽象层,因为我只在抽象层中调用 CRUD 操作 DAO 函数。

我尝试为多个 table 插入数据,最后我抛出了异常以确保事务必须回滚。但是即使也发生异常,数据仍在捕获。

 --Controller code Start
@RequestMapping(value = "/new", method = RequestMethod.GET)
public String add() throws Exception {

    addDTO();
    return "demo";

}

protected void addDTO() {

    try {
        service.addDTO();
    } catch (Exception e) {
        log.error("addDTO", e);
    }
}

 --- Controller code End


 --- Abstract Service with concrete method
@Override
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = { Exception.class })
public void addDTO() throws Exception {
    try {

        E entity = this.entityFromDTO();
        this.dao.add(entity);

        // Added For Transaction Test START
        TMstPackage packType = getPackageEntity();
        mstPackageDao.add(packType);

        throw new Exception("Transaction RollBack test");

        // Added For Transaction Test END

    } catch (Exception ex) {
        Log.error("addData");
        throw ex;
    }

}

 --- Concrete Service
@Override
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = { Exception.class })
protected TMstContainer entityFromDTO() throws Exception {

    TMstContainer container = null;
    try {
        Date date = Calendar.getInstance().getTime();
        container = new TMstContainer();
        container.setCntCode("TEST1");
        container.setCntDescription("Test Desc");

        container.setCntDtCreate(date);
        container.setCntDtLupd(date);
        container.setCntStatus('A');
        container.setCntUidCreate("SYS");
        container.setCntUidLupd("SYS");

    } catch (Exception e) {
        log.error(e);
    }
     return container;
}

我尝试通过使用@Transactional 在具体 class 函数中定义相同的代码,它工作正常。但是如果我用相同的注释把它带到抽象函数中,数据就会被捕获到 database.Can 任何人都请帮忙。

抽象图像 Class 定义了具体方法和 @Transactional 注释:

这是预期的行为。 @Transactional 方法应该直接从外部调用,在这种情况下应该通过 spring 注入来检索对象实例。 Spring 在这里没有任何魔法。它从您指定的 class 创建一个 AOP 代理,如果有人使用该代理调用方法,如果该方法被注释为 @Transactional ,则该代理方法调用处理程序将通过事务模板执行它。 如果您直接从非跨国方法调用跨国方法,那么 class,spring 什么都不知道。