Я изо всех сил пытаюсь понять, как я должен иметь дело с JTA и CDI, работающими на экземпляре Jboss EAP 7. Я могу получить транзакцию вручную, введя объект UserTransaction, исходящий из контейнера, но когда я аннотирую метод с @Transactional, я получаю исключение из-за отсутствия транзакции .... Мой вопрос. Отсутствует ли какая-либо конфигурация? Я коротко читаю, что, возможно, мне нужно создать перехватчик для того, чтобы он работал, но я не нашел никакого последовательного примера ...Jboss EAP 7 CDI JTA @Transactional
0
A
ответ
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
sMyBean
, и вы называетеMyBean.withinTransaction
, то новая транзакция будет создана (если уже не существует). Потому что вы пересекаете границы бобов междуAnotherBean.outsideTransaction
иMyBean.withinTransaction
.
Я чувствую, что данных для этого вопроса недостаточно, чтобы получить ответ лучше, чем полный учебник JEE о том, как настроить приложение с подключением к базе данных. И это выходит за рамки StackOverflow. Можете ли вы ограничить свою проблему? Например, вы спрашиваете, есть ли какой-либо конфиг, без указания того, какой у вас на самом деле. Или вставьте любой код, который мог бы сказать нам, если вы делаете то, что говорите, что делаете правильно. – Deltharis
Вы сделали что-нибудь, что бы отключить автоматические транзакции? –
Нам нужно знать, где вы разместили аннотацию @Transactional. Пожалуйста, поделитесь своим кодом. Вам не нужен перехватчик, поскольку «@Transactional» уже является перехватчиком перехватчика. – Rouliboy