2012-05-31 28 views
1

我正在開發一個Java EE應用程序,用戶可以在其中註冊某些單元。我想,要分離的標籤上,當用戶登錄要顯示的每個單元。支持bean的動態內容不會立即在視圖中更新

<p:tabView id="unitTabs" cache="false" var="unit" value="#{getUnitsOfLoggedInUser(loginController.checkedUser)}"> 
     <p:tab id="unitTab" title="#{unit.unitName}"> 

      //content here 

     </p:tab> 
</p:tabView> 

在支持bean我有這樣的方法

public List<Unit> getUnitsOfLoggedInUser(User user) { 
    unitsOfLoggedInUser = (List<Unit>) user.getUnitCollection(); 
    return unitsOfLoggedInUser; 
} 

然而,如果用戶創建新單元,新選項卡將不會立即顯示。即使我刷新頁面,它仍然不顯示。但是,如果我重新啓動服務器並再次運行,則新選項卡將會在那裏。看起來它有一些緩存屬性,並且不會在每次調用時加載。

另外,當我調試代碼時,方法getUnitsOfLoggedInUser(user)在頁面呈現之前被調用多次。

我也試圖與JSF數據表,但它的行爲是相同的,所以它不是Primefaces庫的問題

有沒有人有我怎樣才能解決這個什麼建議嗎?謝謝

回答

3

答案取決於你保存新單位的方式。一種選擇是在保存新單元后刷新user實體。在任何情況下,你可以節省,其中em是你的EntityManager的實例後做

em.refresh(user); 

更新:

你也可以在新的單元添加到用戶的集合,然後合併/編輯用戶,而不是直接創建新單位。然後,您不需要刷新用戶,因爲您已將該單元手動添加到集合中。

+0

我向EJB中添加了對方法'create'所說的內容。但我收到異常'引發:java.lang.IllegalArgumentException:無法刷新不管理的對象:類web.effectinet.entities.User.'我使用netbeans生成的代碼爲EJB,所以我重寫了' UnitFacade' EJB – interboy

+2

這和預期的一樣。在單元的創建方法中,不管理用戶。不知道你的實體和它們之間的關係很難說。如果您有1:n的用戶和單位關係,您也可以將新單位添加到用戶集合,然後合併/編輯用戶,而不是直接創建新單位。然後,您不需要刷新用戶,因爲您已將該單元手動添加到集合中。 –

+0

謝謝你的幫助。我設法通過在創建單元時手動修改用戶對象的unitCollection屬性來實現。但是,我想出於好奇而問一些問題。之前,我嘗試在用戶EJB中創建一個刷新(用戶用戶)方法。但是,當從託管bean調用此函數時,我收到了異常'java.lang.IllegalArgumentException:無法刷新[userId = 31]的管理對象,這是當時登錄的用戶。我無法理解爲什麼這不起作用。不管怎麼說,再次感謝 – interboy