2010-07-14 4 views
2

Я использую Java EE6 и JSF для создания простого приложения CRUD.Страницы Jsf не показывают недавно добавленные значения

На многих моих страницах 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;   
    } 

Есть ли обходной путь, по которому я могу уничтожить и воссоздать сессия? Или любым другим способом, с помощью которого я могу решить эту проблему?

EDIT: Я думаю, вопрос сводится к тому, почему коллекция не обновляется после вставки записи, даже если отношения один-ко-многим определяется в классе Persistence

EDIT 2: Вместо того, чтобы использовать в коллекции я использую Named Query сейчас, и он извлекает новую запись, как ожидалось. Я предположил, что коллекция должна быть обновлена ​​автоматически. Возможно, это не так?

ответ

1

EDIT 2: Вместо того, чтобы использовать коллекции, я использую именованный запрос сейчас, и он получает новый рекорд как ожидается. Я предположил, что коллекция должна быть обновлена ​​автоматически . Возможно, это не правда?

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

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

3

Как правило, это нехорошо иметь фасоль с сессией для этих случаев. Сделайте свой фасоль @ViewScoped.

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

+0

Спасибо за отзыв о ViewScope. Что касается коллекции, я получаю ее каждый раз, но у нее нет новой записи. – Akshay

Смежные вопросы