休眠和选择性延迟加载

时间:2010-11-19 00:22:16

标签: hibernate lazy-loading

我将以下类结构映射到我的数据库,在我的图表中注意b是A的一对多子,等等。

a
-b
--c
-d
--e
---f
---g

现在,当我从hibernate获取结果集时,我将其插入jibx进行编组并发送给客户端。我的问题是当jibx尝试访问延迟加载记录时,我得到一个异常,因为那时它与hibernate会话断开连接。

现在更糟糕的是,有些交易我希望拥有a,b,c,d类的所有记录,但没有e,f,g。但是下一个查询可能需要a,d,e,f,g以及b或c中的所有查询以及下一个查询a,d,g和其余查询全部。

所以,我的DAO类看起来像这样

public class SurveyNameDAO extends HibernateDaoSupport
{
public List<SurveyName> getPermittedSurveys(String userName)
    {
        StringBuffer sql = new StringBuffer();
        sql.append("select distinct sn ");
        sql.append("from SurveyName as sn, SurveyNameStore name_store ");
        sql.append("where name_store.showStoreLocation.storeName in (select ng.pnName ");
        sql.append("from NukeGroups as ng, NukeUsers as nu ");
        sql.append("where nu.pnName = '" + userName + "')");

        SurveyName loc = null;
        List l = getHibernateTemplate().find(sql.toString());

        return l;

    }
}

基本问题是我如何修改这个方法(以及许多喜欢它),我可以添加某种指示器,以上面提到的方式加载返回类,然后完全断开与hibernate的连接并忘记延迟加载当我发送给jibx时。

1 个答案:

答案 0 :(得分:0)

默认情况下,hibernate会加载子对象Lazily。这意味着,只会加载查询的对象,即在您的示例中,将加载 SurveyName 对象。

假设 SurveyName 对应于您在上面显示的树中的实体 A ,只有id的 B D ,它们是 A <中的直接引用对象/ strong>将被加载。

您可以详细了解这个What is lazy loading in Hibernate?Explanations of lazy loading

至于你的问题,你需要在会​​话中获取引用的对象。因此,在您的示例中,您需要遍历 列表l ,并在每个项目上获取 SurveyNameStore 对象列表以便加载它们。

在此之后,您可以传递 SurveyName 对象,并且 SurveyNameStore 引用可以发送到客户。

同样,您可以分别在每个方法中加载所需的所有对象。

我没有你的班级结构,所以我不能给你确切的解决方案,但如果你还没有解决它,那么在这些方面工作应该可以解决你的问题。