@BatchSize如何在Hibernate中深入解释?

时间:2015-01-30 14:42:35

标签: java hibernate jpa entity

我从网上和论坛上阅读了有关BatchSize的相关主题,但我仍然不了解某些部分。所以我们来描述我理解的和不理解的东西。

  

批量提取:选择提取的优化策略。   Hibernate在一个中检索一批实体实例或集合   单个SELECT,通过指定主键或外键列表。

让我们拥有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;
...
}

所以我在产品中的制造商上进行了Lazy抓取。所以当我执行select选取时就完成了。所以我有 One-Many< =>制造商 - 产品关系。我想找到所有名称中包含“oak”的制造商。我写道:

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

所以我不明白batchsize如何帮助我。 Hibernate会生成100个选择还是只生成一个(我写的)?或2-to选择TOP 50项目?

1 个答案:

答案 0 :(得分:2)

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

如果你采用这个jpql查询

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

hibernate将对产品执行1次选择,一旦您访问第一个制造商,它将为多达50个不同的制造商进行选择。

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

如果您的结果有超过50个不同的制造商并且您对其进行迭代,那么只要您尝试访问未在先前批次选择中重新获得的制造商,就会执行具有此类in子句的下一个查询。