2013-08-24 137 views
0

我有一个JSF应用程序中,用户可以通过loginBean登录如下:用户似乎并没有被清除

public String doLogin() { 
     Query query = ejbFacade.getEntityManager().createNamedQuery("loginQuery", User.class); 
    query.setParameter("email", username); 
    query.setParameter("pw", pw); 
    try { 

     FacesContext context = FacesContext.getCurrentInstance(); 
     context.getExternalContext().getSessionMap().put("user", query.getSingleResult()); 
     return "/loggedin/index?faces-redirect=true"; 
    } catch (NoResultException userNotFoundEx) { 
     FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Unknown login, try again")); 
     return "/public/login"; 
    } 
} 

然后,我有一个产生一个userRegistrationBean @已登录用户。这个bean是SessionScoped所以当一个registrates一个已经登录 要知道,如果用户从“直接登录”或“注册登录”来到我执行以下操作:

@Produces @Logado 
public User getLoggedUser() { 
    if (this.user.getId() == null) { //means no user was registered this time 

     this.loggedUser = FacesContext.getCurrentInstance().context.getExternalContext().getSessionMap().get("user"); 

     if (this.loggedUser != null) { 
      return this.loggedUser; 
     } 

     throw new IllegalStateException("There's no user logged in."); 
    } 

    this.loggedUser = this.user; 
    return this.loggedUser; 
} 

我注销方法:

FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); 
return "/index.xhtml?faces-redirect=true"; 

问题是,当我直接进入数据库并进行更改时,让我们说一些用户名,然后用该登录名进入系统,名称不是最新的。 假设我的数据库是空的。然后我注册一个用户 - >注销 - >手动更改数据库中的某些东西 - >登录该用户。用户数据未更新。 似乎应用程序不会再次从数据库中读取数据,但日食链接会在每次登录时显示 新查询。 请问有人能赐教吗?

回答

1

的EclipseLink拥有二级缓存,你将需要管理,如果你打算让JPA之外的变化。有关缓存的详细信息,请访问:http://wiki.eclipse.org/EclipseLink/Examples/JPA/Caching

最简单的解决方案是如果知道已进行更改,则调用em.refresh(entity),但EclipseLink也具有可刷新的查询提示。作为更极端的选项,您可以禁用共享缓存,但这应该是最后的手段,因为缓存可以提高大多数应用程序的性能。