2017-02-09 6 views
0

Я изо всех сил пытаюсь понять, как я должен иметь дело с JTA и CDI, работающими на экземпляре Jboss EAP 7. Я могу получить транзакцию вручную, введя объект UserTransaction, исходящий из контейнера, но когда я аннотирую метод с @Transactional, я получаю исключение из-за отсутствия транзакции .... Мой вопрос. Отсутствует ли какая-либо конфигурация? Я коротко читаю, что, возможно, мне нужно создать перехватчик для того, чтобы он работал, но я не нашел никакого последовательного примера ...Jboss EAP 7 CDI JTA @Transactional

+0

Я чувствую, что данных для этого вопроса недостаточно, чтобы получить ответ лучше, чем полный учебник JEE о том, как настроить приложение с подключением к базе данных. И это выходит за рамки StackOverflow. Можете ли вы ограничить свою проблему? Например, вы спрашиваете, есть ли какой-либо конфиг, без указания того, какой у вас на самом деле. Или вставьте любой код, который мог бы сказать нам, если вы делаете то, что говорите, что делаете правильно. – Deltharis

+0

Вы сделали что-нибудь, что бы отключить автоматические транзакции? –

+0

Нам нужно знать, где вы разместили аннотацию @Transactional. Пожалуйста, поделитесь своим кодом. Вам не нужен перехватчик, поскольку «@Transactional» уже является перехватчиком перехватчика. – Rouliboy

ответ

0

В стандартной среде JEE, управляемой контейнером, только корпоративные компоненты (обычно @Stateless beans используются) являются транзакционными. Когда вы введете такой компонент извне, транзакция будет открыта. С аннотацией @javax.transaction.Transactional вы можете контролировать поведение транзакций, но это необязательно в случае по умолчанию.

Пример фасоли:

@Stateless 
public MyBean { 
    public void withinTransaction() { 
    System.out.println("i'm running within a transaction"); 
    } 
    @Transactional(TxType.NOT_SUPPORTED) 
    public void outsideTransaction() { 
    System.out.println("no transaction available..."); 
    } 
} 
  • При вызове MyBean.withinTransaction из сервлета (например, с помощью REST), новая транзакция создается (если уже не присутствует).
  • Если вы звоните MyBean.outsideTransaction, транзакции не будут созданы.
  • Если вы звоните this.outsideTransaction() из withinTransaction, вы до сих пор сделок доступны в outsideTransaction (потому что перехватчики только связаны с границами боба)
  • Если вы звоните this.withinTransaction() из outsideTransaction никаких новой транзакции не создается (потому что перехватчики только связаны с границами боба)
  • Если outsideTransaction будет частью второй боб AnotherBean, который @Inject s MyBean, и вы называете MyBean.withinTransaction, то новая транзакция будет создана (если уже не существует). Потому что вы пересекаете границы бобов между AnotherBean.outsideTransaction и MyBean.withinTransaction.
Смежные вопросы