数据库直接更改/会话似乎未被清除后用户未更新

时间:2013-08-24 04:31:37

标签: jsf session login eclipselink logout

我有一个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,它生成一个@LoggedIn用户。这个bean是SessionScoped所以当一个注册时已经登录了。 要知道用户是来自“直接登录”还是“注册登录”,我执行以下操作:

@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";

问题是,当我直接进入数据库并进行更改时,让我们说一些用户名,然后我使用该登录进入系统,该名称不是最新的。 假设我的数据库是空的。然后我注册一个用户 - >注销 - >手动更改数据库中的内容 - >登录该用户。用户数据未更新。 似乎应用程序永远不会再次从数据库中读取,但eclipse链接显示 每次登录时都有一个新查询。 有人可以开导我吗?

1 个答案:

答案 0 :(得分:1)

EclipseLink有一个二级缓存,如果要在JPA之外进行更改,则需要管理它。有关缓存的详细信息,请访问:http://wiki.eclipse.org/EclipseLink/Examples/JPA/Caching

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