2013-08-24 189 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也具有可刷新的查詢提示。作爲更極端的選項,您可以禁用共享緩存,但這應該是最後的手段,因爲緩存可以提高大多數應用程序的性能。