Единственное, что приходит на ум (если вы извините за каламбур), это то, что если вы вызываете cancelReservation()
из другого метода внутри компонента, то я не уверен, что аннотация транзакции будет соблюдена.В конечном итоге аннотация работает, вызывая перехватчик, и я полагаю, что перехватчики применяются только к вызовам между различными классами (это то, что я действительно должен проверить).
Итак, если у вас есть нетранзакционный метод в бинекоторый вызывает транзакционный метод, тогда транзакция не будет запущена при вызове транзакционного метода.
Я могу быть совершенно неправ в этом.Я пойду и прочитаю спецификацию и вернусь к вам.
РЕДАКТИРОВАТЬ: Я прочитал спецификацию, и она напомнила мне, что за зона бедствия - спецификации J2EE.Ужасающий.Однако раздел о транзакциях, по-видимому, подразумевает, что атрибуты транзакции применяются только к вызовам, сделанным в бизнес-интерфейсе EJB.Я считаю, что вызовы от одного метода к другому внутри компонента не считаются проходящими через бизнес-интерфейс, даже когда вызываемый метод является частью этого интерфейса.Поэтому вы не ожидаете, что они привлекут транзакции.
Что-то, что вы могли бы попробовать, это направить их через интерфейс;нет хорошего способа сделать это, но вы должны иметь возможность внедрить собственную ссылку на бизнес-интерфейс следующим образом:
public class RegistrationStateful implements RegistrationStatefulRemote {
@EJB
private RegistrationStatefulRemote self;
Затем вы можете изменить свой метод @PreDestroy, чтобы он выглядел так:
@PreDestroy
public void destroy() {
self.cancelReservation();
}
И я считаю, что это должно считаться обычным вызовом бизнес-интерфейса с транзакциями и т. Д.
На самом деле я никогда не пробовал этого, так что это может быть полным мусором.Если вы попробуете, дайте мне знать, как это работает!