Hibernate-如何使关联变得(全局)迫切?

Hibernate-如何使关联变得(全局)迫切?,hibernate,Hibernate,是否有一些简单的方法可以获取大对象图的所有关联,而不必“左连接获取”所有关联?我不能告诉Hibernate在默认情况下获取关联吗?即使可能有一个全局的lazy=false(google没有显示它,但它可能是可能的),您也确实不想这样做。是否确实要为每个请求加载整个数据库或重要对象图?请记住,按照hibernate的工作方式,它需要实例化图中的每个对象。这将是缓慢和内存密集型的,并可能会崩溃你的应用程序,因为你的数据增长 如果必须加载大量数据,请使用自定义hql查询,并从表中提取所需的字段。避免对

是否有一些简单的方法可以获取大对象图的所有关联,而不必“左连接获取”所有关联?我不能告诉Hibernate在默认情况下获取关联吗?

即使可能有一个全局的
lazy=false
(google没有显示它,但它可能是可能的),您也确实不想这样做。是否确实要为每个请求加载整个数据库或重要对象图?请记住,按照hibernate的工作方式,它需要实例化图中的每个对象。这将是缓慢和内存密集型的,并可能会崩溃你的应用程序,因为你的数据增长

如果必须加载大量数据,请使用自定义hql查询,并从表中提取所需的字段。避免对象实例化。此外,您还可以让db通过使用;i、 e.让db不断动态更新虚拟表,因此您只需要从web应用透视图中选择一个表


另一个选择是重新设计您的交互,这样您就不必在一开始就这样做。

我也不知道有全局切换。不过,使用注释控制抓取是可行的

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

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

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


我建议您阅读hibernate手册中的详细信息。

您可以将其放入hibernate映射标记中:

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

但是你不会满意的

顺便说一下:即时加载和加入获取是不同的概念!两者都不是避免任何问题的灵丹妙药

  • 通常,使用急加载可能会出现严重的N+1问题
  • 通常,使用连接获取可能会导致结果的大量乘法
在适当的情况下使用这两种方法-如果有疑问,避免使用这两种方法


请参阅Ayende Rahien的相关博客文章:


有时您不希望延迟加载(例如,在i多服务器设置中)。@deadsven:我们使用DTO解决了所有这些问题。有一些初步的努力,但最终它比尝试序列化服务器对象图方便得多。它是否急切地获取整个对象图?我知道这是一个糟糕的方法,但我确实需要它。设置lazy=false会急切地加载图形。但它仍然需要与使用延迟加载和访问图中的每个对象时相同数量的查询。