【发布时间】:2011-10-13 09:29:07
【问题描述】:
我担心我错过了一个非常基本的观点,但我现在被困住了,希望有人能把我盯着它的眼睛指向正确的那个... 我尝试逐步完成我的应用程序设置以使自己清楚(希望人们在发帖结束之前不会感到无聊):
我有一个会话范围的 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>
action方法存储引用:
public void setCurrentEvent(MyEvent currentEvent) {
this.currentEvent = currentEvent;
...
在上面的集合和引用中使用的实体中,有一个默认延迟加载的关系:
@ManyToMany(mappedBy="supportedServices")
public Set<MyEntity> getSupportingEntities() {
...
现在,在详细视图中并尝试通过以下方式访问此关系时:
#{eventHandler.currentEvent.supportingEntities...}
我得到一个 org.hibernate.LazyInitializationException 告诉我会话已关闭。
当处理程序是会话范围并通过查询加载引用时,处理程序是否应该能够在稍后的第二个视图中加载请求的关系?
【问题讨论】:
标签: jsf-2 jpa-2.0 java-ee-6 cdi entitymanager