Jsf页面不显示新添加的值

时间:2010-07-14 07:07:53

标签: java jsf jsf-2

我正在使用Java EE6和JSF来创建一个简单的CRUD应用程序。

在我的许多JSF页面中,我有一个selectOneMenu供用户选择现有项目。例如,如果用户正在添加“考试”,他/她可以从组合框中选择“部门”,因为它们具有一对多的关系。

问题在于,无论何时添加新部门,在会话超时之前都不会更新组合框值。我需要使用SessionScoped支持bean,因为我需要在多个请求中保持值。

这是我用来填充selectOneMenu的函数(不完全如上所述,但非常相似):

public SelectItem[] getExamsByDepartment(){
        if(departmentMaster!=null){
            Collection<ExamMaster> examMasterCollection = departmentMaster.getExamMasterCollection();
            //Problem: newly added exams aren't shown until session is re-created
            if (examMasterCollection != null && examMasterCollection.size() > 0) {
                SelectItem[] selectItem = new SelectItem[examMasterCollection.size()];
                Iterator<ExamMaster> i = examMasterCollection.iterator();
                int count = 0;
                while (i.hasNext()) {
                    ExamMaster tmpExamMaster = i.next();
                    selectItem[count++] = new SelectItem(tmpExamMaster, tmpExamMaster.getExamName());
                }
                return selectItem;
            }
        }
        SelectItem[] selectItem = new SelectItem[1];
        selectItem[0] = new SelectItem("", "[No exams found]");
        return selectItem;        
    }

我可以通过哪些解决方法来销毁和重新创建会话?或者我可以用其他任何方式解决这个问题?

编辑:我想这个问题归结为为什么Collection在插入记录后不会更新,即使在Persistence类中定义了一对多关系

编辑2:我现在使用命名查询而不是使用集合,而是按预期获取新记录。我原以为集合应该自动更新。也许这不是真的吗?

2 个答案:

答案 0 :(得分:3)

通常,为这些情况设置会话范围的bean并不是一个好主意。制作你的bean @ViewScoped

此外,每当您添加项目时,请重新获取该集合。 (这将涵盖同一用户添加然后读取集合的情况)

答案 1 :(得分:1)

  

编辑2:而不是使用   集合,我正在使用命名查询   现在,它将新记录作为   预期。我曾经假设过   收藏应该更新   自动的。也许事实并非如此   真?

对象的集合仅在重新同步到数据库时更新。如果您没有明确地重新同步到数据库,它将不会更新。

会话中的对象将拥有它的值的副本,除非实际告诉它,否则不需要返回数据库。