Проблема с транзакициями.
Есть странноватая система.
EJB3.
Stateful и Stateless-бины. Один (Stateless) дает доступ к базе (получение объектов), транзакции в нем управляются автоматически. Второй (Stateful) – управляет транзакциями сам (как оно там, Bean managed вроде).
При помощи Stateless-бина вытаскиваются какие-то объекты, делаются проверки, создаются какие-то новые объекты (просто new). Потом группу этих самых новых объектов хочется сохранить, причем через Stateful-бин.
Почему так сложно? Всю группу нужно сохранять в одной транзакции… В общем, так исторически сложилось.
Итого, получается как-то так:
получаем Stateful
Stateless.getObject(…)
Stateless.executeSelectJPQL(…)
(повторяется по необходимости, создаем новые объекты, сохраняем их в список)
далее в цикле делаем Stateful.saveObject(…) (тут при первом сэйве должна начаться транзакция)
Stateful.commit();
Внимание, вопрос! Почему при первом же сохранении вылетает замечательный эксепшн, говорящий о том, что транзакции-то нет! И это несмотря, на то, что save делается так:
startTransaction вполне себе вызывается, но внутри save есть flush, который грохается с требованием вернуть транзакцию.
Шпашыбо всем. Голова уже кругом, поэтому если что-то описал по-привычке непонятно – обращайтесь, всё разъясню, как смогу. :-)
UPDATE: Усем спасибо, усе свободны. Оказывается, я тормоз. А flush() - закрывает транзакцию, если она есть. С чего бы это? Ну, и ладно.
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() - закрывает транзакцию, если она есть. С чего бы это? Ну, и ладно.
