gpt4 book ai didi

java - 利用 Hibernate 延迟加载?

转载 作者:行者123 更新时间:2023-12-01 07:42:26 25 4
gpt4 key购买 nike

我有一个域对象,它有一个属性,该属性是包含另一个域对象的集合。这是使用 hibernate 映射(最终在另一个表上执行联接)来完成的。默认情况下,Hibernate 似乎会延迟实例化该集合。事实证明这是一件很棒的事情,因为根据我需要显示的内容,我并不总是需要加载集合。

我的问题如下:在编写 hibernate 查询(在我的 DAO 中)时,我使用以下命令打开/关闭 session :

Session session = getSessionFactory().openSession();
//query goes here using the session var
session.close();

问题是:当 Hibernate 最终开始延迟加载我的集合时,Session 早已关闭!我该如何解决这个问题?我认为我必须像我正在做的那样关闭 session ...

这是我得到的错误:

SEVERE: failed to lazily initialize a collection of ...

最佳答案

如果这种情况发生在 Web 应用程序中,那么简单的解决方法是使用 OpenSessionInViewInterceptorOpenSessionInViewFilter 。这些会延迟 session 的关闭,直到整个请求完成,从而允许您在渲染 View 时导航惰性关联。

更通用的解决方案是重写您的查询,以便它们明确指定应预先获取哪些关联。这使您可以在默认情况下保持关联惰性,同时满足您希望急切获取它们的特殊情况。参见"fetch joins"的描述在 Hibernate 文档中。

A "fetch" join allows associations or collections of values to be initialized along with their parent objects using a single select. This is particularly useful in the case of a collection. It effectively overrides the outer join and lazy declarations of the mapping file for associations and collections

关于java - 利用 Hibernate 延迟加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2303540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com