2016-01-26 59 views
2

我是Hibernate的新手,但在C#中的实体框架有丰富的经验。我喜欢的一个功能是动态决定在查询中立即加载什么内容。例如,考虑类和学生实体的一对多关系。动态渴望&懒惰在休眠加载

在一个“类视图”页面上,我可以这样做:

context.Configuration.EnableLazyLoading = true; //default option 
List<Classes> classes = context.Classes.ToList(); 

现在我可以高兴地只显示类的信息,而不会浪费资源收集学生数据。只有当用户点击“查看与名册类”做我做到以下几点:

context.Configuration.EnableLazyLoading = true; 
List<Classes> classes = context.Classes.Include(c => c.Students).ToList(); 

有了一个说法,我能够决定,在这种特殊情况下,我想立刻抓住所有的信息。不是两个查询。没有一百个查询。只有一个查询。尽管在几秒钟之前只加载了类。

我在Hibernate上阅读的所有内容都解释了如何在关系的配置文件中指定lazy =“true | false”,但我真的想要决定何时加载集合的选项。毕竟,我不想购买只能以30英里/小时或60英里/小时的速度驾驶的汽车。我需要根据自己的位置来选择速度。

或许使用fetch模式作为JOIN的选项是可以接受的,因为在这种情况下它只会有两个查询(一个是为班级,另一个为学生),但我真的很喜欢可以选择这样做在一个查询中,特别是如果我有几个子集合要加载并且不想执行每个关系的查询。我意识到一次加入会创建需要流式传输的额外数据,但我很惊讶这种控制级别不容易完成,或者可能完全不可用。

+2

你的问题是什么? –

回答

0

对于动态抓取,Hibernate没有非常灵活的方法。您可以通过

  1. 使用Dynamic fetching via HQL queriesjoin fetch控制它(如@ThibaultClement建议)。
  2. 使用Dynamic association fetchingCriteria.setFetchMode()
  3. 使用Dynamic fetching via profiles@FetchProfile注释。

你也可以参考HQL joined query to eager fetch a large number of relationships了解更多的想法。

+0

够公平的。我想确定我没有忽略明显的东西,特别是因为Hibernate有各种收集数据的方式。我只需要摆脱“实体框架思维”,并意识到不同的ORMs不会有1-1对应的功能。 – AirmanAJK

+0

@AirmanAJK可能是,如果你还没有做,你可以看一看[Querydsl](http://www.querydsl.com/),这会很有趣。 –

相关问题