有状态会话bean会忘记值

时间:2013-05-03 12:23:24

标签: java-ee-6 stateful-session-bean

使用Java EE,我需要使用有状态会话Bean。

@Stateful
@TransactionManagement(TransactionManagementType.BEAN)
public class FacadeExercice extends AbstractFacade<EntityBeanExercice>
  implements IFacadeExercice {

@PersistenceContext(unitName = "GestionCours-ejbPU")
private EntityManager em;
@Resource
private UserTransaction transaction;
private int lastChange;
private int connections;

[...]

@Override
public EntityBeanExercice find(Object id) {
    EntityBeanExercice ex = null;
    connections += 5;
    try {
        transaction.begin();
        ex = super.find(id);
        lastChange = ex.getLastChange();
        transaction.commit();
    } catch (Exception ex1) {
        Logger.getLogger(FacadeExercice.class.getName()).log(
          Level.SEVERE, null, ex1);
    }
    return ex;
}
}

但每次我输入我的bean时,connections变量都设置为0。

我不知道在哪里可以搜索解决方案。

1 个答案:

答案 0 :(得分:2)

在这些情况下可能会出现此问题:

  • SFSB的生命周期与其客户端的生命周期相关联。

如果你有一个命令行客户端,你的SFSB工作正常。当命令行应用程序终止时,也会删除SFSB。

例如,如果JSP / servlet使用SFSB,那么当HTTP请求完成时,它的生命周期结束。如果要在HTTP请求中存活,则必须将其句柄放在HTTP会话中:从JNDI查找获得实例后,应将该实例作为属性放在HttpSession中。使用此SFSB的下一个HTTP请求必须从HttpSession获取句柄。

  • 每个JNDI查找都返回一个新实例

来自EJB 3.1, 4.6 Stateful Session Bean State Diagram

的引用
  

通过显式查找或以其他方式获取有状态会话bean时   JNDI查找机制,容器必须提供新的有状态会话bean实例,如   Java EE规范要求(“Java命名和目录接口(JNDI)”一节)   命名上下文“[12])。

所以你不应该多次查找SFSB。