【问题标题】:Force eager loading of otherwise lazy loaded properties强制预先加载其他延迟加载的属性
【发布时间】:2010-10-14 10:32:10
【问题描述】:

我有一个 Hibernate 对象,它的属性都是惰性加载的。这些属性大部分是其他 Hibernate 对象或 PersistentSet。

现在我想强制 Hibernate 一次性加载这些属性。

当然,我可以用object.getSite().size()“触摸”这些属性中的每一个,但也许还有另一种方法可以实现我的目标。

【问题讨论】:

    标签: java hibernate lazy-loading eager-loading


    【解决方案1】:

    这是一个老问题,但我也想指出静态方法Hibernate.initialize

    示例用法:

    Person p = sess.createCriteria(Person.class, id);
    Hibernate.initialize(p.getChildren());
    

    现在,即使在会话关闭后也可以使用子级。

    【讨论】:

      【解决方案2】:

      文档是这样写的:

      您可以强制执行通常的急切获取 在 HQL 中使用 fetch all properties 的属性。

      参考文献

      【讨论】:

        【解决方案3】:

        Dozer 非常适合这种类型的事情 - 您可以要求 Dozer 将对象映射到同一类的另一个实例,并且 Dozer 将访问从当前对象可访问的所有对象。

        请参阅this answer to a similar questionmy answer to another related question 了解更多详情。

        【讨论】:

          【解决方案4】:

          对我来说这是可行的:

          Person p = (Parent) sess.get(Person.class, id);
          Hibernate.initialize(p.getChildren());
          

          而不是这样:

          Person p = sess.createCriteria(Person.class, id);
          Hibernate.initialize(p.getChildren());
          

          【讨论】:

            【解决方案5】:

            三种方式

            1.HQL 带左连接子节点

            2.createCriteria后的SetFetchMode

            3.Hibernate.initialize

            【讨论】:

              【解决方案6】:

              这很慢,因为它会为需要初始化的每个项目进行往返,但它可以完成工作。

              private void RecursiveInitialize(object o,IList completed)
              {
                  if (completed == null) throw new ArgumentNullException("completed");
              
                  if (o == null) return;            
              
                  if (completed.Contains(o)) return;            
              
                  NHibernateUtil.Initialize(o);
              
                  completed.Add(o);
              
                  var type = NHibernateUtil.GetClass(o);
              
                  if (type.IsSealed) return;
              
                  foreach (var prop in type.GetProperties())
                  {
                      if (prop.PropertyType.IsArray)
                      {
                          var result = prop.GetValue(o, null) as IEnumerable;
                          if (result == null) return;
                          foreach (var item in result)
                          {
                              RecursiveInitialize(item, completed);
                          }
                      }
                      else if (prop.PropertyType.GetGenericArguments().Length > 0)
                      {
                          var result = prop.GetValue(o, null) as IEnumerable;
                          if (result == null) return;
                          foreach (var item in result)
                          {
                              RecursiveInitialize(item, completed);
                          }
                      }
                      else
                      {
                          var value = prop.GetValue(o, null);
                          RecursiveInitialize(value, completed);
                      }
                  }
              }
              

              【讨论】:

                【解决方案7】:

                根据hibernate docs,您应该能够通过在特定属性映射上设置lazy 属性来禁用延迟属性加载:

                <class name="Document">
                  <id name="id">
                    <generator class="native"/>
                  </id>
                  <property length="50" name="name" not-null="true"/>
                  <property lazy="false" length="200" name="summary" not-null="true"/>
                  <property lazy="false" length="2000" name="text" not-null="true"/>
                </class>
                

                【讨论】:

                • 我不想改变配置,这是设置的懒惰。我只想实现一个实例的急切加载。
                猜你喜欢
                • 2017-06-03
                • 2017-12-28
                • 1970-01-01
                • 2013-07-03
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-07-26
                • 1970-01-01
                相关资源
                最近更新 更多