Я использую Java EE6 и JSF для создания простого приложения CRUD.
На многих моих страницах JSF у меня есть selectOneMenu, чтобы пользователь мог выбрать существующий элемент. Например, если пользователь добавляет «Экзамен», он/она может выбрать «Отдел» из поля со списком, поскольку они имеют отношение «один ко многим».
Проблема в том, что всякий раз, когда добавляется новый отдел, значения поля со списком не обновляются до тех пор, пока не истечет время сеанса. Мне нужно использовать компоненты поддержки SessionScoped, потому что мне нужно, чтобы значения сохранялись в нескольких запросах.
Вот функция, которую я использую для заполнения 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;
}
Есть ли обходной путь, с помощью которого я могу уничтожить и воссоздать сеанс? Или любой другой способ, которым я могу решить эту проблему?
РЕДАКТИРОВАТЬ: я думаю, проблема сводится к тому, почему коллекция не обновляется после вставки записи, даже если отношение «один ко многим» определено в классе Persistence
РЕДАКТИРОВАТЬ 2: вместо использования коллекции я сейчас использую именованный запрос, и он извлекает новую запись, как и ожидалось. Я предполагал, что Коллекция должна обновляться автоматически. Возможно, это неправда?