Почему CMT фиксирует при выходе из EJB метода, когда атрибут транзакции "Required"?

Я постоянно обнаруживаю, что моя уже существующая транзакция фиксируется внутри любого метода EJB помеченного @ejb.transaction type="Required". Может ли это быть правильно?

Мое ожидание, что EJB "требуемая" транзакция означает: если она уже есть, то он вежливо оставит ее нефиксированной после выполнения, чтобы тот, кто вызвал begin(), мог продолжать использовать ее для дальнейших операций перед вызовом commit() или rollback(). [Конечно, если бы не было транзакции, то EJB метод вызывал бы и begin(), и commit()/rollback().]

Мои ожидания ошибочны, или мне следует искать ошибку в конфигурации?

Может быть уместно добавить, что я использую Hibernate 3 внутри EJB. Я получаю UserTransaction перед вызовом метода EJB. Сгенерированная обёртка EJB вызывает ServerTransaction.commit() при выходе, к которой Hibernate подключается и использует возможность закрыть свой сеанс. Ошибка, которую я получаю - это ленивое исключение загрузки в спящем режиме, потому что сессия закрывается, когда я пытаюсь получить доступ к геттерам на объекте, находящемся в спящем режиме. Поэтому технически я не уверен на 100%, что ServerTransaction.commit(), который я заметил, обязательно зафиксировал UserTransaction, которую я запустил (возможно ServerTransaction. commit() на самом деле не всегда выполняет "настоящий" коммит?), но если нет - тогда на каком основании Hibernate закрывает сессию?

Обновление: Я считаю, что мои предположения выше были верны, но мои наблюдения были немного не верны. См. ниже мой самонадеянный Ответ.

8
задан Tiny 29 August 2015 в 06:05
поделиться