2012-11-29 4 views
5

Я думаю, что здесь у меня проблема с базовым пониманием, и я надеюсь, что кто-то может объяснить это мне.JAVA EE 6 экземпляры экземпляров между stateful EJB

Допустим, у нас есть с учетом состояния EJB_A и с учетом состояния EJB_B и SessionScoped ManagedbeanA:

@Stateful 
@LocalBean 
public class EJB_A { 
} 

@Stateful 
@LocalBean 
public class EJB_B { 
    @EJB 
    EJB_A ejb; 
} 
@ManagedBean 
@SessionScoped 
public class ManagedBeanA { 
    @EJB 
    EJB_A ejb; 
} 

В ManagedBeanA, то EJB_A создается. Теперь, когда я использую EJB_B, который имеет свойство EJB_A как свойство, в EJB_B создается новый экземпляр EJB_A. Это не тот же экземпляр EJB_A, который ранее был создан в ManagedBeanA.

Я не понимаю этого, потому что я думал, что все точки EJB с состоянием - это то, что для каждого клиента создается только один экземпляр, который совместно используется и управляется EJB-контейнером. Может кто-нибудь, пожалуйста, объясните мне это? И, пожалуйста, также объясните, как я могу добиться того, что один и тот же экземпляр EJB разделяется несколькими другими EJB?

Спасибо

+0

Когда вы говорите " Теперь, когда я использую EJB_B, что вы подразумеваете под этим? Как вы подтвердили, что это не тот же самый экземпляр? –

+0

Когда я внедряю EJB_B и смотрю на свойства (например, строковое свойство) EJB_A, свойства компонента EJB_A отличаются от свойств EJB_A, которые были вызваны управляемым компонентом. – user1727072

+0

Где вы "instanciate 'EJB_B; в пределах другого ManagedBean или Java-клиента (удаленный поиск)? –

ответ

9

Да, вы перепутали разные понятия, и другое APIS тоже ... я предпочел бы использовать @Inject над @EJB и указать объем закачиваемого экземпляра ..

@Stateful 
@LocalBean 
public class EJB_A { 
} 

@Stateful 
@LocalBean 
public class EJB_B { 
    @Inject @SessionScoped 
    EJB_A ejb; 
} 
@ManagedBean 
@SessionScoped 
public class ManagedBeanA { 
    @Inject @SessionScoped 
    EJB_A ejb; 
} 
+0

Можете ли вы объяснить, почему я должен использовать @Inject вместо @EJB? – user1727072

+1

Ну, углубленное обсуждение темы: [link] http://www.seamframework.org/107780.lace В принципе, дискриминантный фактор заключается в том, что '@ Inject' всегда знает о масштабах и что вы уверены, что инъецируемый экземпляр является управляемым (таким образом предотвращая неприятные проблемы сериализации удаленного компонента). Используя '@ Inject', вы получаете (иногда проксированный) управляемый объект, используя' @ EJB', вы получаете ресурс, мало чем отличающийся от простого поиска JNDI. –

+0

спасибо, что многое для меня упрощает :)! – user1727072

1

Я предполагаю, что я перепутал две вещи - @Sessionscoped и @Stateful.

@Stateful аннотация не означает, что создается только один экземпляр для каждого клиента. Это просто означает, что @ Stateful-EJB принадлежит только одному клиенту, тогда как @ Stateless-EJB может использоваться несколькими клиентами.

Так что @ Stateful-EJB имеет отношение N: 1 (N @ Stateful-EJB принадлежат только одному клиенту), а @ Stateless-EJB имеет отношение N: M (N @ Stateless-EJBS принадлежит M клиентам). Это означает, что EJB-экземпляр не может использоваться несколькими другими EJB, просто используя @ EJB-Annotation для @Stateful EJB.

Кажется, что @ Sessioncoped-Managedbean, с другой стороны, создается только один раз для каждого клиента.

Я получил это право?

2

Я только что-то прочитал here.

Причина заключается в том, что каждый поиск() из EJB 3.0 сессионного компонента удаленных или локальных результатов бизнес-интерфейс в создании новой идентичности боба. Каждая ссылка, возвращаемая из поиска, относится к другому сеансовому компоненту состояния, содержащемуся в состоянии . Это зависит от вызывающего, чтобы определить , как он хочет управлять доступом к этой ссылке. Обычно приложение web будет хранить ссылку в области HttpSession или для всей области (ServletContext) для последующего доступа.

И:

Не забудьте в вашем случае мы имеем дело с 2-х типов сессий: на боб сессии и веб-сессии. Первый гарантирует, что после того, как вы получитезапрос на компонент с сохранением состояния, его идентификатор остается таким же, как и во время сеанса пользователя . Но когда вы используете последнее, у вас есть веб-сессия на вершине сеанса bean. Чтобы обеспечить доступ к одному и тому же компоненту из 2 разных JSP (или когда вы делаете перезагрузку), вам необходимо сохранить идентификатор компонента в области веб-сессии.

Таким образом, вы на самом деле правы.Когда вы хотите использовать свой экземпляр, вы должны использовать ManagedBean для его получения в другом месте, поскольку экземпляр EJB связан с этим контекстом сеанса. Поэтому, если вы хотите упростить его и убедитесь, что EJB существует только один раз за сеанс, используйте CDI и дополнительно добавьте комментарий к EJB с помощью @javax.enterprise.context.SessionScoped; чем вы можете быть уверены.

+0

спасибо вам большое! – user1727072

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