2013-05-03 129 views
1

使用Java EE我需要使用有状态会话Bean。有状态会话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; 
} 
} 

但每次我在我的豆进入时,connections变量设置为0。

我不知道我在哪里可以寻找一个解决方案。

回答

2

这个问题可以在这些情况下出现:

  • 一个SFSB的寿命被连接到它的客户机的寿命。

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

如果SFSB由JSP/servlet使用,例如,当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。