【问题标题】:hibernate and selective lazy loading休眠和选择性延迟加载
【发布时间】:2013-01-03 22:47:59
【问题描述】:

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

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

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

现在更糟的是,有些交易我想拥有 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;

    }
}

基本问题是我如何修改这个方法(很多人喜欢它),我可以添加一些指示符,说以我上面所说的方式加载返回类,然后完全断开休眠并忘记延迟加载当我将它发送到 jibx 时。

【问题讨论】:

  • 建议将查询中的变量替换为 a、b、c、...,如上图所示,以便我们了解关系与查询的关系。除此之外,这比我经常做的 SQL 多一点,所以我不知道我可以在不付出更多努力的情况下提供帮助 =)
  • 这不是 HQL 查询的问题,它与告诉 hibernate 如何将结果加载到其类中有关。

标签: hibernate lazy-loading


【解决方案1】:

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

假设 SurveyName 对应于您上面显示的树中的实体 A,只有 id 的BDA中直接引用的对象 将被加载。

您可以阅读有关此What is lazy loading in Hibernate?Explanations of lazy loading 的更多信息。

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

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

类似地,您在每个方法中分别加载您需要的所有对象。

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

【讨论】:

  • 现在没关系。我说服客户把hibernate扔到大街上,用直接的JDBC重写应用程序。在我们重写的模块中,我们已经看到错误数量下降到我们之前遇到的一小部分。我再也不会使用hibernate了,jdbc容易多了。
  • 根据我的经验,hibernate 使基本的东西变得非常容易,但是自定义/复杂的要求或边界情况使事情变得很成问题。好电话!
猜你喜欢
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多