如何在每笔交易开始时运行自定义查询?
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(?,?,?,?)");
//....
}
我在我的项目中使用 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(?,?,?,?)");
//....
}