Spring Boot-如何在每个事务开始时运行自定义查询?

时间:2019-05-17 08:43:26

标签: java hibernate spring-boot spring-data-jpa spring-transactions

我在项目中使用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)过程。

1 个答案:

答案 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