强制加载其他延迟加载的属性

我有一个Hibernate对象,其属性都是懒惰加载的。 大多数这些属性是其他Hibernate对象或PersistentSets。

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

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

文档如下:

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

参考

  • Hibernate核心参考指南
    • 19.1.7。 使用延迟属性获取

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

用法示例:

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

现在,子节点已初始化,即使在会话结束后也可以使用。

Dozer适用于此类事物 – 您可以要求Dozer将对象映射到同一个类的另一个实例,Dozer将访问从当前对象可到达的所有对象。

有关更多详细信息,请参阅此类问题的答案以及我对其他相关问题的回答 。

对我来说这有效:

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

而不是这个:

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

3种方式

1.HQL与左连接子项

2. createCriteria之后的2.SetFetchMode

3.Hibernate.initialize

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

 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); } } } 

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

         
Interesting Posts