Я боюсь, что упускаю очень простой момент, но я застрял на данный момент, надеюсь, кто-то может направить мои глаза в упор на правильное ... Я пытаюсь пройти процедуру настройки приложения,шаг для прояснения (надеюсь, что людям не надоест, пока они не достигнут конца публикации):
У меня есть компонент CDI с областью действия, служащий обработчиком для представления JSF 2.0.Он содержит менеджер сущностей, список объектов и специальный отдельный объект:
@Named
@SessionScoped
public class EventHandler implements Serializable {
@PersistenceContext
private EntityManager em;
private List<MyEvent> events;
private MyEvent currentEvent;
...
Когда представление запрашивает список для отображения таблицы, оно заполняет список путем запроса базы данных:
Query query = em.createQuery("select e from MyEvent e");
events = (ArrayList<MyEvent>) query.getResultList();
Представление показывает это в таблице данных и предоставляет ссылку на метод действия в обработчике:
<h:dataTable value="#{eventHandler.events}" var="_var">
...
<h:commandLink action="#{eventHandler.linkAction(_var)}"> ... </h:commandLink>
Метод действия сохраняет ссылку:
public void setCurrentEvent(MyEvent currentEvent) {
this.currentEvent = currentEvent;
...
Ву сущности, использованной в коллекции и ссылках выше, есть отношение, которое по умолчанию загружается лениво:
@ManyToMany(mappedBy="supportedServices")
public Set<MyEntity> getSupportingEntities() {
...
Теперь, когда вы находитесь в подробном представлении и пытаетесь получить доступ к этому отношению, выполнив:
#{eventHandler.currentEvent.supportingEntities...}
Я получаю исключение org.hibernate.LazyInitializationException, сообщающее, что сеанс закрыт.
Не должен ли обработчик загружать запрошенные отношения на более позднем этапе во втором представлении, когдаобработчик имеет сессионную область и загружает ссылки с помощью запроса?