Страницы Jsf не отображают недавно добавленные значения

Я использую 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: вместо использования коллекции я сейчас использую именованный запрос, и он извлекает новую запись, как и ожидалось. Я предполагал, что Коллекция должна обновляться автоматически. Возможно, это неправда?


person Akshay    schedule 14.07.2010    source источник


Ответы (2)


РЕДАКТИРОВАТЬ 2: вместо использования коллекции я сейчас использую именованный запрос, и он извлекает новую запись, как и ожидалось. Я предполагал, что Коллекция должна обновляться автоматически. Возможно, это неправда?

Коллекция объекта обновляется только при повторной синхронизации с базой данных. Если вы явно не выполняете повторную синхронизацию с базой данных, она не будет обновляться.

Объект в сеансе будет иметь свою копию значений, и ему не нужно будет возвращаться к базе данных, если что-то действительно не скажет ему об этом.

person Drew    schedule 19.07.2010

Как правило, для этих случаев не рекомендуется иметь bean-компоненты с областью действия сеанса. Сделайте свой боб @ViewScoped.

Кроме того, всякий раз, когда вы добавляете элемент, повторно извлекайте коллекцию. (это будет охватывать случай, когда один и тот же пользователь добавляет, а затем читает коллекцию)

person Bozho    schedule 14.07.2010
comment
Спасибо за совет о ViewScope. Что касается Коллекции, то я ее каждый раз беру, но новой записи в ней нет. - person Akshay; 14.07.2010