@BatchSize How works in Hibernate 深度解析?

How @BatchSize works in Hibernate deep explanation?

我在网上和论坛上看了关于BatchSize的相关话题,但还是有些不明白。那么让我们描述一下我理解的和不理解的。

Batch fetching: an optimization strategy for select fetching. Hibernate retrieves a batch of entity instances or collections in a single SELECT by specifying a list of primary or foreign keys.

让我们拥有 JPA 2.0 和 Hibernate 实现。这些实体:

@Entity
public class Product{
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
        @BatchSize(size = 50)
        private Manufacturer manufacturer;

  ...

}

 @Entity
public class Manufacturer {

   @Id
   private long id;
   private String name;
...
}

所以我在产品中延迟获取制造商。所以当我执行 select 时,抓取就完成了。所以我有 One-Many <=>Manufacturer - Product relation。我想找到名称包含 "oak" 的所有制造商。所以我写:

SELECT * FROM product as p
join manufacturer as m on p.id=m.id
where m.name like '%oak%'

所以我不明白 batchsize 对我有什么帮助。 Hibernate 会生成 100 selects 还是只生成一个(我写的)?或 2-to 其中包含 select 个 TOP 50 项目?

首先。您的 @BatchSize 注释必须放在 Manufacturer-Entity 上。此注解只能放在 Collection-fields 上。假设您更正了...

如果你采用这个 jpql 查询

SELECT p FROM product as p where p.manufacturer.name like :name

hibernate 将为产品执行 1 select,一旦您访问第一个制造商,它就会为多达 50 个不同的制造商执行 select。

select ... from manufacturere where ID in (?, ?, ?, ?, ...)

如果您的结果有超过 50 个不同的制造商,并且您对其进行迭代,那么只要您尝试访问在前一批中未检索到的制造商,就会立即执行带有此类 in 子句的下一个查询-select。