集合我怕我会错过一个非常基本的观点,但我坚持的那一刻,希望有人能在这点我的眼睛主演硬到正确的选择。 我尝试通过我的应用程序设置一步一步,让自己清晰(希望人们不会在他们到达发布结束前感到无聊):异常而加载懒洋洋地从实体
我有一个会话作用域CDI组件作为JSF处理程序2.0视图。它拥有一个实体管理器,对象列表和一个特殊的单个对象:
Query query = em.createQuery("select e from MyEvent e");
events = (ArrayList<MyEvent>) query.getResultList();
:
@Named
@SessionScoped
public class EventHandler implements Serializable {
@PersistenceContext
private EntityManager em;
private List<MyEvent> events;
private MyEvent currentEvent;
...
当视图请求列表中显示的表,它通过查询数据库填充列表该视图显示了这种在一个数据表,并提供该处理程序中的链接到动作方法:
<h:dataTable value="#{eventHandler.events}" var="_var">
...
<h:commandLink action="#{eventHandler.linkAction(_var)}"> ... </h:commandLink>
动作方法存储参考:
public void setCurrentEvent(MyEvent currentEvent) {
this.currentEvent = currentEvent;
...
内搜集和上述文献中使用的实体,它会直接默认延迟加载there'a关系:
@ManyToMany(mappedBy="supportedServices")
public Set<MyEntity> getSupportingEntities() {
...
现在,在详细视图是和试图访问这个关系时这样做的:
#{eventHandler.currentEvent.supportingEntities...}
我得到一个org.hibernate.LazyInitializationException告诉我,会话关闭。
不宜处理程序能够装载在第二视图稍后的请求的关系,当处理程序是会话范围,并通过加载查询的引用?
谢谢你的提示。但是既没有使用type = PersistenceContextType.EXTENDED,也没有将它合并到em中,而且在映射中使用预先获取是不成问题的。但是我看到,如果我在动作处理程序中设置currentEvent时触及关系,它就会起作用。不过,我不明白为什么他们以后不能加载实体的一部分。 –
因为我还找不到其他解释,我会接受你的答案。 –