Spring Boot - как запускать пользовательский запрос в начале каждой транзакции? - PullRequest
1 голос
/ 17 мая 2019

Я использую БД Firebird в своем проекте, а мои хранимые процедуры в БД используют пользовательские контекстные переменные , которые находятся в области транзакции.

Так что я должен установить некоторые переменные в контексте в начале каждой транзакции. Как реализовать это, не повторяя код в каждом аннотированном методе @Transactional?

Пример:

-Controller

    @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);
    }

}

- Repository

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

Большинство хранимых процедур пытаются получить информацию об отеле из контекстных переменных, поэтому мне приходится вызывать execute procedure SP_CTX_SET_LOGIN_INFO(:hotelrefno, :userid) процедуру в начале каждой транзакции.

1 Ответ

1 голос
/ 17 мая 2019

Вы можете создать До Аспекта

@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

...