【问题标题】:Hibernate 5 Lazy Loading IssueHibernate 5 延迟加载问题
【发布时间】:2019-09-07 21:39:57
【问题描述】:

我有一个包含项目列表(集合)的用户类:

@OneToMany(mappedBy = "user_owner_id")
private Collection<Project> project = new ArrayList<>();

在某个时候,我想查看项目列表并获取它们:

Session sessionF = sessionFactory.openSession();
sessionF.beginTransaction();        
user = sessionF.get(User.class, user.getId());
sessionF.getTransaction().commit();
List<Project> projects = (List<Project>) user.getProject();     
sessionF.close();

如果我不使用 projects 做某事,则会引发错误:org.hibernate.LazyInitializationException: could not initialize proxy – no Session

但如果我添加int projectCount = projects.size();,它就可以正常工作。为什么会发生这种情况?如果不在这里玩projects,我该如何解决?

附:在我关闭会话后,我只是通过HttpServletRequest 传递它,然后在jsp 文件中对其进行for循环。

【问题讨论】:

  • 第一种情况,懒惰的关联在会话打开的时候从不加载,但是你在会话关闭后尝试加载,所以没有办法从数据库中取出数据不再,因此例外。在第二种情况下,您在会话仍处于打开状态时加载惰性集合,因此一旦关闭,它仍然存在于内存中。
  • 不应该将user.getProject() 加载到List&lt;Project&gt; projects 吗?这是我感到困惑的部分。那为什么projects.size()会加载呢?

标签: java hibernate jsp servlets


【解决方案1】:

查看 Hibernate 参考文档的 Fetching Strategies 部分

延迟集合获取 - 当应用程序对该集合调用操作时获取集合。 (这是集合的默认设置。)

从实体返回您的集合并将其分配给变量并不涉及调用该集合的方法。

【讨论】:

    最近更新 更多