gpt4 book ai didi

java - 如何在显示JSP后执行hibernate session.close()以避免lazy=false

转载 作者:行者123 更新时间:2023-11-30 04:07:16 24 4
gpt4 key购买 nike

这里的问题是我遇到了这个异常:

org.hibernate.LazyInitializationException:未能延迟初始化角色集合:com...,没有 session 或 session 已关闭

我知道发生这种情况是因为我在尝试访问某些信息之前执行了 session.close() 。我也知道,我可以通过设置延迟加载lazy=false来解决这个问题,但这会加载该集合中的每个对象,并且JSP的加载会很慢。

所以这里的问题是在使用lazy=true将信息加载到JSP上之后如何执行session.close()。最好知道是否还有其他选择可以做到这一点。

下面是我如何访问数据库:

public Collection<Object> className(Object object){
Session session = Conexion.getSession();
Transaction tx = session.beginTransaction();
...
Collection<Object> result = crit.list();
tx.commit();
session.close();
return result;
}

我们将不胜感激您提供的所有帮助。

最佳答案

您需要确保 JSP 中显示的所有信息都已加载。将延迟加载设置为 false 可以修复此问题,但正如您所注意到的,它会急切地加载所有内容,这可能会损害性能。

因此请检查您的 JSP,然后确保集合和其他延迟加载的内容实际上是在显示 JSP 时加载的(通过修改获取查询,或显式获取连接的集合)。这需要您手动工作,但话又说回来,编写代码就是您的报酬。

编辑:一些如何进行选择性延迟加载的示例。

按照 Hibernate Query Language 中所述使用 HQL 和获取:

"from Cat as cat left join fetch cat.kittens"

即使 Cat.kittens 通常是一个惰性集合,由于显式的“fetch”语句,它也会被急切地获取。

另一种方法是在 session 打开时访问集合,强制进行延迟获取:

Cat cat = ... // load Cat from database
int size = cat.kittens.size(); // Triggers a fetch for the collection

第一个版本显然更干净。

关于java - 如何在显示JSP后执行hibernate session.close()以避免lazy=false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20441395/

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