我正在使用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:我现在使用命名查询而不是使用集合,而是按预期获取新记录。我原以为集合应该自动更新。也许这不是真的吗?
答案 0 :(得分:3)
通常,为这些情况设置会话范围的bean并不是一个好主意。制作你的bean @ViewScoped
。
此外,每当您添加项目时,请重新获取该集合。 (这将涵盖同一用户添加然后读取集合的情况)
答案 1 :(得分:1)
编辑2:而不是使用 集合,我正在使用命名查询 现在,它将新记录作为 预期。我曾经假设过 收藏应该更新 自动的。也许事实并非如此 真?
对象的集合仅在重新同步到数据库时更新。如果您没有明确地重新同步到数据库,它将不会更新。
会话中的对象将拥有它的值的副本,除非实际告诉它,否则不需要返回数据库。