java - @BatchSize 在 Hibernate 中如何工作深入解释?

标签 java hibernate jpa entity

我从网上和论坛上阅读了有关 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.

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

@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;
...
}

所以我对产品中的制造商进行了延迟获取。所以当我执行选择提取时就完成了。所以我有一对多<=>制造商-产品关系。我想找到所有名称包含“oak”的制造商。所以我写:

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

所以我不明白批量大小如何帮助我。 Hibernate 会生成 100 个选择还是仅生成一个(我写的)?或者 2-to 中选择 TOP 50 商品?

最佳答案

首先。您的 @BatchSize 注释必须放置在制造商实体上。此注释只能放置在集合字段上。假设您更正了...

如果您执行此 jpql 查询

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

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

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

如果您的结果有超过 50 个不同的制造商,并且您对其进行迭代,那么当您尝试访问未在先前批量选择中检索的制造商时,将立即执行带有此类 in 子句的下一个查询。

关于java - @BatchSize 在 Hibernate 中如何工作深入解释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28238277/

相关文章:

java - 如何正确读取byte java文件

java - 如何合并具有空列表的实体?

java - 如何让Hibernate只查询默认映射?

java - 使用 SingularAttribute 中的 getName() 函数时出现 NullPointerException

java - OpenSessionInView 与 PersistenceContext(扩展)

mysql - Vaadin 上传图像并将其存储到数据库

java - 找不到 gl_MultiTexCoord0 替代品

Java I/O 读取文本同时隐藏特定单词

java - 实例化其子类将取决于用户输入的对象

java - 在您的配置中定义 'bean' 、 "Consider defining a bean named 'EntityManagerFactory' 时遇到麻烦”