почему мои сервисы не записываются в базу данных при вызове их из компонентов? - PullRequest
0 голосов
/ 03 июля 2019

Я создаю выражение делегата для процесса Camunda, рабочий процесс работает отлично, но когда он выполняет делегат, мои службы создают объекты и не записывают их в базу данных.это код:

@Component
public class CreateNewROAction implements JavaDelegate {

    private final ROactionService rOactionService;
    private final RiskService riskService;
    private Logger logger = LoggerFactory.getLogger(CreateNewROAction.class);
    public CreateNewROAction(ROactionService rOactionService, RiskService riskService) {
    this.rOactionService = rOactionService;
    this.riskService = riskService;
}

    @Override
    public void execute(DelegateExecution delegateExecution) throws Exception {

        String processInstanceId = delegateExecution.getProcessInstanceId();
        String riskId = delegateExecution.getVariable("riskId").toString();
        Risk risk = riskService.findById(Long.parseLong(riskId));
        ROaction rOaction = new ROaction();
        rOaction.setProcessInstanceId(processInstanceId);
        rOaction = rOactionService.save(rOaction);
        logger.info("roAction object: " + rOaction.toString());
        risk.setAction(rOaction);
        risk = riskService.update(risk, risk.getId());
        logger.info("risk object: " + risk.toString());
        delegateExecution.setVariable("id", rOaction.getId());

    }
}

регистраторы показывают ожидаемый результат:

roAction object: ROaction(id=4, description=null, status=null, responsible=null, deadline=null, AchievementDate=null, effectivenessEvaluationDate=null, effectivenessEvaluation=null, processInstanceId=819, createdAt=Wed Jul 03 15:08:19 CET 2019, updatedAt=Wed Jul 03 15:08:19 CET 2019)
risk object: Risk(id=4, description=null, probability=0, impact=0, cause=null, consequence=null, createdAt=2019-07-03 15:07:04.975, updatedAt=2019-07-03 15:07:04.975, processes=[], action=ROaction(id=4, description=null, status=null, responsible=null, deadline=null, AchievementDate=null, effectivenessEvaluationDate=null, effectivenessEvaluation=null, processInstanceId=819, createdAt=Wed Jul 03 15:08:19 CET 2019, updatedAt=Wed Jul 03 15:08:19 CET 2019), processInstanceId=801)

, но база данных пуста.
Примечания:
1. У меня былоизменить идентификатор объекта на @GeneratedValue (стратегии = GenerationType.SEQUENCE), поскольку до этого служба возвращает нулевой идентификатор из функции save ()
2. службы работают нормально из контроллеров

1 Ответ

0 голосов
/ 07 июля 2019

Решение состоит не в том, чтобы вызывать сервисные методы напрямую, а в том, чтобы вызывать их через частные методы, аннотированные @Transactional.Причина в том, что Hibernate открывает соединение с базой данных при первом вызове, а затем закрывает его.Компонент имеет только одну связь с базой данных, поэтому он не может получить к ней доступ после первого вызова.@Transactional открыть новое соединение с базой данных для метода.

...