当前位置: 首页 > 知识库问答 >
问题:

@BatchSize在Hibernate中是如何工作的?

宰父淳
2023-03-14

我从网上和论坛上看到了关于BatchSize的相关主题,但我仍然不明白一些部分。所以让我们描述一下我理解的和不理解的。

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

让我们有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 fetching时,就完成了。所以我有很多

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

所以我不明白batchsize对我有什么帮助。Hibernate会生成100个选择,还是只生成一个(我写的)?或者2-to,选择其中的前50项?

共有1个答案

燕禄
2023-03-14

首先。您的@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子句的下一个查询。

 类似资料:
  • Hibernate留档在@BatchSize上提供了一些信息,如下所示: @BatchSize指定一个“批量大小”,用于按标识符获取此类实例。尚未加载的实例一次加载一个批大小(默认值为1)。 我不清楚这个注释的目的是什么,什么时候我们需要使用它。请帮助我理解何时使用这个注释。

  • 本文向大家介绍hibernate 是如何工作的?相关面试题,主要包含被问及hibernate 是如何工作的?时的应答技巧和注意事项,需要的朋友参考一下 读取并解析配置文件。 读取并解析映射文件,创建 SessionFactory。 打开 Session。 创建事务。 进行持久化操作。 提交事务。 关闭 Session。 关闭 SessionFactory。

  • 问题内容: 我提到了许多文章,但仍然不清楚hibernate状态下的性能。 根据我到目前为止遇到的是,当我们使用批量保存/更新时,如下所示: 用于刷新会话强制Hibernate将Session的内存中状态与数据库同步。 题 1. 刷新会话后,为什么需要这样做?真的需要吗? 2. 会执行提交动作吗? 3. 如果逐出所有已加载的对象,则在执行提交和回滚操作时内部会发生什么? 问题答案: 可以将会话视为

  • 在我加入的新项目中,他们一直交替使用术语Hibernate和JPA。所以,我试图深入研究代码并试图理解整个事情是如何工作的(我是Spring、JPA和Hibernate世界的新手)。我将尝试将代码放在这里以更好地理解:1)有一个@Configuration类,其中有以下内容: 因此,在这个配置类中,我们返回一个EntityManagerFactory。 2) 然后是一个标记为@persistor的

  • 问题内容: 我正在使用带有Hibernate的MS SQL Server 2008。我的问题是Hibernate如何实现 采取以下简单方案。 如果我有一个返回100行的查询,并且如果我将1传递给,这会影响SQL Server本身返回的结果(就像运行一条语句一样),还是Hibernate首先获取所有结果(在这种情况下为所有100行)并挑选最高的自己? 我问的原因是,当行数开始增加时,它将出现巨大的性

  • 在Spark中是如何工作的? 如果我们注册一个对象作为一个表,会将所有数据保存在内存中吗?