如何在每笔交易开始时运行自定义查询?

How to run custom query in the beginning of each transaction?

我在我的项目中使用 Firebird 数据库,而我在数据库中的存储过程使用的是事务范围内的自定义 context variables

我必须在每次交易开始时将一些变量设置为上下文。我如何在不在每个 @Transactional 注释方法中重复代码的情况下实现它?

示例:

控制器

@RestController
@RequestMapping({TBL_EMPLOYEE, TBL_EMP})
public class EmployeeController extends EmployeeCommonController<Employee> {
         
@GetMapping(PATH_LASTLOGIN)
    public List<UserLastLoginWrapper> getUserLastLoginWrapper(Long userid, tring appname) {
        return getService().getUserLastLoginWrapper(userid, appname);
    }
}
    

服务

@Transactional
public class EmployeeService{
  public List<UserLastLoginWrapper> getUserLastLoginWrapper(Long userid, String appname) {
        return ((EmployeeRepository) getRepository()).getUserLastLoginWrapper(null, userid, appname);
    }
}

存储库

@NamedNativeQuery(name = "Employee.getUserLastLoginWrapper", query = "select * from SP_USER_LAST_LOGIN(:userid, :appname)", resultSetMapping = UserLastLoginWrapper.USERLASTLOGINWRAPPER)

大多数存储过程都试图从上下文变量中获取 hotelrefno 信息,因此我必须在每个事务开始时调用 execute procedure SP_CTX_SET_LOGIN_INFO(:hotelrefno, :userid) 过程。

您可以创建一个 Before Aspect

@Aspect
public class ProdcedureAspect {

    @Before("execution(* **.*Service.*(..))")
    public void doBefore(JoinPoint joinPoint) { 
       // execute procedure SP_CTX_SET_LOGIN_INFO(:hotelrefno, :userid)
    }
}

在此处详细了解 Spring AOP:

https://docs.spring.io/spring/docs/5.1.7.RELEASE/spring-framework-reference/core.html#aop-api

我在连接后调用了这个查询。请参阅下面的方面配置。

@AfterReturning(pointcut = "execution(* *.getConnection(..))", returning = "connection")
public Connection prepare(Connection connection) throws SQLException {
CallableStatement cs = connection.prepareCall(
                "execute procedure SP_CTX_SET_LOGIN_INFO(?,?,?,?)");
//....
}