了解Hibernate hibernate.max_fetch_depth和hibernate.default_batch_fetch_size

Cha*_*nya 14 java hibernate

休眠documenation给出了一些Hibernate配置属性.其中,

hibernate.max_fetch_depth

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

了hibernate.default_batch_fetch_size

设置Hibernate批量提取关联的默认大小.例如,推荐值4,8,16

我是Hibernate的新手,有人可以通过一个例子来帮助我理解这一点.

提前致谢.

Maa*_*els 16

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

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

  • 我将max_fetch_depth设置为2是什么,我尝试访问属性person.getAddress().getCity().getCountry().因为我将setmax_fetch_depth设置为2,是否会返回空指针? (4认同)
  • 不,你所有的 manyToOne EAGER 实体都是水合的,但是在深度为 2 之后,Hibernate 将为图形的剩余深度生成新的特定查询。在我们的示例中,第一个查询将带回 Person + Address + City 实体,并且将执行新查询以获取 Country 实体 (2认同)