Hibernate - 如何让关联渴望(全球)?

时间:2011-08-02 12:59:43

标签: hibernate

是否有一些简单的方法来获取大对象图的所有关联而无需“左连接获取”所有这些?我不能告诉Hibernate默认获取关联的关联吗?

4 个答案:

答案 0 :(得分:6)

即使有可能有全局lazy=false(谷歌没有显示它,但可能有可能),你真的不想这样做。您是否真的想为每个请求加载整个数据库或重要的对象图?请记住,hibernate的工作方式,它需要实例化图中的每个对象。它将变得缓慢且占用大量内存,并且随着数据的增长可能会使您的应用程序崩溃。

如果必须加载大量数据,请使用自定义hql查询,并从表中提取所需的字段。避免对象实例化。此外,您可以使用view让数据库执行大量繁重工作;即让db持续动态更新虚拟表,因此您只需从web-apps角度选择一个表。

另一个选择是重新设计您的互动,这样您就不必首先这样做了。

答案 1 :(得分:5)

你可以将它放入hibernate-mapping标签:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false">

但你不会对它感到满意。

顺便说一句:渴望加载和加入获取是不同的概念!两者都不是银子弹,以避免任何问题。

  • 通常使用急切加载可能会导致严重的N + 1问题
  • 通常使用连接提取可能会导致结果大量增加。

在适当的地方使用 - 如果有疑问则避免两者。


请参阅Ayende Rahien撰写的相关博文:

答案 2 :(得分:1)

我也不知道全局转换。但是,使用注释控制提取仍然有效。

@Proxy(lazy = false)
public class SomeBean {
...
    @ManyToOne(fetch = FetchType.EAGER)
    private OtherBean otherbean;
...
}

答案 3 :(得分:1)

在HQL中,您需要指定您想要急切地获取关联。

无论如何,正如@hvgotcodes所述,试图快速获取所有内容会导致性能问题。在尝试这样做时,您很可能会发现自己正在获取大部分数据库。

我建议您阅读hibernate手册中的Fetching Strategies以获取详细信息。