有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java利用Hibernate延迟加载?

我有一个域对象,它的属性是包含另一个域对象的集合。这是通过hibernate映射实现的(它最终会在另一个表上执行连接)。默认情况下,Hibernate似乎懒洋洋地实例化这个集合。这是一件很棒的事情,因为根据我需要显示的内容,我并不总是需要加载集合

我的问题如下:在编写hibernate查询(在DAO中)时,我使用以下方法打开/关闭会话:

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

问题是:当Hibernate终于开始懒洋洋地加载我的收藏时,Session早就关闭了!我怎样才能避开这件事?我想我必须像现在这样结束这次会议

这就是我得到的错误:

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

共 (1) 个答案

  1. # 1 楼答案

    我知道您为每个DAO操作打开和关闭会话。您可以由所有DAO使用同一个会话,在初始化期间打开,在关闭时关闭。注意,Hibernate Reference提到“每个操作的会话”是一种反模式:

    “不要使用每操作会话反模式:不要在单个线程中为每个简单的数据库调用打开和关闭会话。”

    简而言之,一次会议应该包含一个工作单元。这可能是单个用户请求(可能包括多个查询),也可能是更长的对话(包括多个屏幕和他们自己的(组)查询)。在后一种情况下,有理由考虑不让会话(=事务)在用户思考时间的较长时间内保持打开状态,但在我看来,您的情况与此不同

    如果关闭会话,域对象将分离。你可以打开一个新的会话,将你的对象绑定到它,然后加载集合,但对我来说,这看起来相当麻烦