【问题标题】:Understanding Hibernate hibernate.max_fetch_depth and hibernate.default_batch_fetch_size了解 Hibernate hibernate.max_fetch_depth 和 hibernate.default_batch_fetch_size
【发布时间】:2014-08-05 19:09:08
【问题描述】:

Hibernate documenation 提供了一些 Hibernate 配置属性。其中,

hibernate.max_fetch_depth

为单端的外连接提取树设置最大“深度” 关联(一对一,多对一)。 A 0 禁用默认外部 加入抓取。例如推荐值在 0 到 3 之间

hibernate.default_batch_fetch_size

设置 Hibernate 批量获取关联的默认大小。例如 推荐值 4、8、16

我是 Hibernate 的新手,有人可以通过示例帮助我理解这一点。

提前致谢。

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    max_fetch_depth: 想象一个人和一个地址实体。每个人都住在一个地址(非常简单的系统),但很多人可能住在同一个地址。在对象模型中,Person 可能具有地址属性。这将被映射为多对一(如文档所述)。 现在,当从数据库中获取 Person 时,hibernate 会遇到这个属性。在数据库中,它是具有地址表外键的列。要获取关联的对象,可以使用到该表的连接。结果数据将用于填充将在人员的地址属性上设置的地址对象。从这个意义上说,Hibernate 在获取对象时会遍历对象图。 现在如果 Address 有一个属性 City 怎么办?这也将是多对一的,并且将通过相同的逻辑导致连接。如果城市有一个财产国家怎么办?一样。 进行许多连接对性能不利。在某些时候,最好进行单独的选择,从缓存中获取数据或注入代理。这个配置属性决定了hibernate在获取数据时会通过join遍历多少个关联。

    default_batch_fetch_size: 这是一个非常低级的属性,它确定 Hibernate 在查询集合关联时将请求 JDBC 驱动程序获取/加载多少行。如果您要查询一个国家/地区的所有城市(上一个示例),那么通过通过 JDBC 连接批量加载数据,将数据作为对象传入内存的过程将更加简化。与环相比,查询执行我们的应用程序处理数据所需的时间,然而,它通常是微不足道的。将配置属性保留为默认值通常是正确的。

    【讨论】:

    • 什么是我将 max_fetch_depth 设置为 2 并尝试访问属性 person.getAddress().getCity().getCountry()。既然我将 setmax_fetch_depth 设置为 2,那会返回一个空指针吗?
    • 不,您所有的 manyToOne EAGER 实体都已水合,但在深度为 2 之后,Hibernate 将为图的剩余深度生成新的特定查询。在我们的示例中,第一个查询将带回 Person + Address + City 实体,并且将执行新查询以获取 Country 实体
    • default_batch_fetch_size 与上面解释的不同——它与集合无关!在获取未初始化的属性(例如 OneToOne)期间,它只获取实体的值,但也从 BatchFetchQueue 获取与 default_batch_fetch_size -1 其他实体一样多的值。请参阅用户指南的“获取”和“批处理属性”部分(数字和链接取决于版本)。
    猜你喜欢
    • 2014-06-14
    • 2011-03-27
    • 2011-06-13
    • 2019-10-04
    • 2023-04-08
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    • 2015-01-03
    相关资源
    最近更新 更多