2016-12-20 1 views
0

У меня есть метод (скажем, метод A), где я сохраняю объект в db; этот метод находится внутри EJB One. В рамках метода A после слияния объекта я вызываю другой метод (скажем, метод B), который должен работать с данными, сохраненными в методе A. Метод B находится внутри EJB Two. Оба EJB являются безгражданскими и в одном ухе, поэтому в EJB One я использую локальный интерфейс EJB Two. Оба имеют:Контекст сохранения между безстоящими EJB

@PersistenceContext(unitName = "emDevices") 
    private EntityManager em; 

Когда метод Б считывает данные из БД не может найти новые данные, сохраненные ранее в методе А. я пытался использовать @TransactionAttribute (TransactionAttributeType.SUPPORTS) без какого-либо успеха. Кто-нибудь знает, почему метод B не может видеть данные, сохраненные методом A, даже если они используют один и тот же контекст персистентности?

Я использую спящий режим 4.0.0 и WebLogic 12.1.3 (J2EE6)

+0

Это должно дать вам приличное представление о том, как работают транзакции с bean-компонентами http://docs.oracle.com/javaee/5/tutorial/doc/bncij.html –

+0

Когда вы говорите «после слияния», вы на самом деле вызываете слияние(). Слияние и упорство, вероятно, будут делать то же самое в этом контексте, но по моему опыту многие разработчики не знают, как правильно использовать слияние. –

ответ

2

Если я вас правильно понимаю, вы впрыснуть EJB Два в одном EJB. Если у вас нет параметра TransactionAttribute, установленного в EJB One, по умолчанию используется REQUIRED, которое запустит транзакцию, если она еще не была запущена. Для сохранения данных необходима транзакция. Затем, если вы введете EJB Two в EJB One и вызовите метод EJB Two, транзакция будет распространена. Все должно быть в порядке. Вы правы, что контекст постоянства является общим. Итак, вы должны : сможете прочитать, что было написано ранее, если это действительно та же транзакция.

A) Что Вы имеете в виду: данные? Я думаю, вы используете em.find? Тогда это нормально; если вы имеете в виду запрос, было бы ясно, что запрос не будет возвращать данные, поскольку он все еще находится в контексте персистентности; данные будут совершены в конце транзакции.

Так что может быть неправильно, если это не пункт, упомянутый в A)?

  • Я бы посмотрел, если это действительно тот же контекст персистентности, распечатав его экземпляр в обоих методах; это должен быть тот же адрес.
  • Действительно ли это та же транзакция?
  • Действительно ли ваш код, что вы описали? На мой взгляд, это должно сработать. Так может быть скрытая разница?

Если мой ответ не помогает, отправьте немного больше своего кода; мы могли бы, вероятно, помочь тогда.

+0

Я полностью согласен с этим анализом. –

+0

Также он работает точно так же, как вы используете Spring в приложении Java SE. Я предпочитаю использовать весну вместо EJB (за исключением некоторых редких случаев, мне нужны сессионные компоненты с сохранением состояния). –

Смежные вопросы