Я постоянно обнаруживаю, что моя уже существующая транзакция фиксируется внутри любого метода 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 закрывает сессию?
Обновление: Я считаю, что мои предположения выше были верны, но мои наблюдения были немного не верны. См. ниже мой самонадеянный Ответ.