Image

Imagebealex wrote in Imageru_java

Category:

Проблема с транзакициями.

Есть странноватая система.
EJB3.

Stateful и Stateless-бины. Один (Stateless) дает доступ к базе (получение объектов), транзакции в нем управляются автоматически. Второй (Stateful) – управляет транзакциями сам (как оно там, Bean managed вроде).

При помощи Stateless-бина вытаскиваются какие-то объекты, делаются проверки, создаются какие-то новые объекты (просто new). Потом группу этих самых новых объектов хочется сохранить, причем через Stateful-бин.

Почему так сложно? Всю группу нужно сохранять в одной транзакции… В общем, так исторически сложилось.

Итого, получается как-то так:

получаем Stateful
Stateless.getObject(…)
Stateless.executeSelectJPQL(…)
(повторяется по необходимости, создаем новые объекты, сохраняем их в список)
далее в цикле делаем Stateful.saveObject(…) (тут при первом сэйве должна начаться транзакция)
Stateful.commit();

Внимание, вопрос! Почему при первом же сохранении вылетает замечательный эксепшн, говорящий о том, что транзакции-то нет! И это несмотря, на то, что save делается так:

public BusinessObject save(BusinessObject aObject, 
                   ClientContext aContext) throws Exception {
  startTransaction();
  return super.save(aObject, aContext);
}

private void startTransaction() throws Exception {
  if (!_alreadyStarted) {
    _transaction.begin();
    _alreadyStarted = true;
  }
}


startTransaction вполне себе вызывается, но внутри save есть flush, который грохается с требованием вернуть транзакцию.

Шпашыбо всем. Голова уже кругом, поэтому если что-то описал по-привычке непонятно – обращайтесь, всё разъясню, как смогу. :-)


UPDATE: Усем спасибо, усе свободны. Оказывается, я тормоз. А flush() - закрывает транзакцию, если она есть. С чего бы это? Ну, и ладно.