Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在显示JSP后执行hibernate会话.close()以避免lazy=false_Java_Hibernate_Jsp_Session_Struts2 - Fatal编程技术网

Java 如何在显示JSP后执行hibernate会话.close()以避免lazy=false

Java 如何在显示JSP后执行hibernate会话.close()以避免lazy=false,java,hibernate,jsp,session,struts2,Java,Hibernate,Jsp,Session,Struts2,这里的问题是我得到了这个例外: org.hibernate.LazyInitializationException:未能延迟初始化角色集合:com…,未关闭任何会话或会话 我知道发生这种情况是因为我在尝试访问某些信息之前执行了session.close()。我也知道,通过设置lazy-load-lazy=false可以很好地解决这个问题,但是这会加载集合中的每个对象,JSP的加载会很慢 所以这里的问题是,在信息以lazy=true加载到JSP上之后,如何执行session.close()。如果知

这里的问题是我得到了这个例外:

org.hibernate.LazyInitializationException:未能延迟初始化角色集合:com…,未关闭任何会话或会话

我知道发生这种情况是因为我在尝试访问某些信息之前执行了session.close()。我也知道,通过设置lazy-load-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;
}
公共集合类名(对象){
Session Session=Conexion.getSession();
事务tx=会话.beginTransaction();
...
收集结果=crit.list();
tx.commit();
session.close();
返回结果;
}

感谢您提供的所有帮助。

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

因此,请检查您的JSP,然后确保集合和其他延迟加载的内容实际上是在显示JSP时加载的(通过修改fetch查询或显式获取连接的集合)。这需要您进行手工操作,但同样地,编写代码是您需要支付的费用

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

使用HQL和fetch,如中所述:

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

另一种方法是在会话打开时访问集合,强制执行延迟抓取:

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

第一个版本显然更干净。

I Kayaman,非常感谢您的评论,我非常感谢。然而,这并没有真正澄清我如何才能做到你所说的(行为和代码方面的)至于你所说的,我知道我必须加载要在JSP中显示的数据的唯一方法是设置lazy=false。@Moises在会话打开时在控制器中获取它们。这听起来可能真的很愚蠢……但我在控制器中获取它吗?我完全不明白控制器是什么。@Moises您发布的代码位于您的控制器中。您应该研究一下hibernate,您可以使用HQL进行显式获取(因此某些内容不会被延迟加载)。另一种方法是在数据加载阶段访问代码中的延迟加载集合。我将用一些代码示例更新答案。@Kayaman现在我明白你们的意思了。。。我以为控制员就是你说的,但我弄糊涂了。这是我第一个使用struts2和hibernate的网站。耐心点:)你能贴一张stacktrace吗?另外,我不明白关于管理Hibernate会话或异常的问题。为了更快地给你一个更好的建议,发布。
Cat cat = ... // load Cat from database
int size = cat.kittens.size(); // Triggers a fetch for the collection