我在项目中使用Firebird DB,并且我在DB中的存储过程正在使用自定义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)
大多数存储过程都是tryig来从上下文变量中获取hotelrefno信息,因此我必须在每次交易开始时调用execute procedure SP_CTX_SET_LOGIN_INFO(:hotelrefno, :userid)
过程。
答案 0 :(得分:1)
您可以创建一个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