Jsf 会话范围的托管bean与有状态ejb

Jsf 会话范围的托管bean与有状态ejb,jsf,ejb,managed-bean,stateful-session-bean,Jsf,Ejb,Managed Bean,Stateful Session Bean,如果我有一个@ManagedBean即@SessionScoped,为什么我要使用@StatefulEJB?我以前使用它来购物车和维护会话状态,但由于在用户会话期间将保留一个托管bean,因此我可以将状态存储在那里,然后调用SLSB以获取业务逻辑。对吗?如果是,那么有状态EJB将留给更具体的应用程序,例如当您需要事务时 通常无状态会话bean可用于解决许多业务问题 有状态并不一定意味着只有远程服务器保持状态,尽管这肯定是一种选择。远程Swing客户端可以首先向有状态会话bean发送一组数据,保留

如果我有一个
@ManagedBean
@SessionScoped
,为什么我要使用
@Stateful
EJB?我以前使用它来购物车和维护会话状态,但由于在用户会话期间将保留一个托管bean,因此我可以将状态存储在那里,然后调用SLSB以获取业务逻辑。对吗?如果是,那么有状态EJB将留给更具体的应用程序,例如当您需要事务时

通常无状态会话bean可用于解决许多业务问题

有状态并不一定意味着只有远程服务器保持状态,尽管这肯定是一种选择。远程Swing客户端可以首先向有状态会话bean发送一组数据,保留存根,然后发送一些对这些数据进行操作的命令。这样,客户机就不必每次都发送相同(大量)的数据

在远程用例中,它确实在某种程度上反映了使用web客户端(浏览器)时HTTP会话的使用情况。主要区别在于,这里的会话是每个bean的,而对于HTTP会话,会话是许多bean共享的作用域。由于HTTP会话基于Cookie,并且Cookie对于整个浏览器的域是全局的,因此HTTP会话不能直接支持来自同一客户端的多个会话(例如,每个选项卡或每个窗口)。这对于有状态会话bean来说是微不足道的

然而

与远程EJB通信的远程Swing客户端并不常见

在您在问题中描述的上下文中,您通常会使用本地EJB,并且将大部分状态存储在HTTP会话中(注意共享!),现在存储在视图范围或对话范围中

那么,最后,在这个场景中何时使用有状态会话bean呢

一个重要的用例是
JPA
中的
扩展持久性上下文。通常,对于事务范围的实体管理器,当实体跨越EJB方法调用的事务边界时,它将被分离。如果希望(乐观地)在用户交互之间锁定实体,这是不可取的。你会把锁弄丢的


对于扩展持久性上下文,当您从对有状态会话bean的调用返回时,实体保持连接并且锁有效。这对于预览功能非常有用,可以确保在预览完成后,没有其他人对实体进行任何更改。或者,对于购物车,您希望确保在购物车中的某段时间内,商品不会出售给任何其他人。

谢谢您提供的详细答案。我认为有状态bean的使用被简化为非常具体的东西