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

在Hibernate中理解@BatchSize

段干跃
2023-03-14

Hibernate留档在@BatchSize上提供了一些信息,如下所示:

@BatchSize指定一个“批量大小”,用于按标识符获取此类实例。尚未加载的实例一次加载一个批大小(默认值为1)。

我不清楚这个注释的目的是什么,什么时候我们需要使用它。请帮助我理解何时使用这个注释。

共有2个答案

微生嘉祥
2023-03-14

@BatchSize将根据您的大小从数据库中获取记录。假设您的结果中有100条记录,如果将批处理大小定义为10,那么每次db调用将获取10条记录。从逻辑上讲,它将提高性能。

令狐烨烨
2023-03-14

使用批处理获取,如果访问一个代理,Hibernate可以加载多个未初始化的代理。批处理获取是延迟选择获取策略的优化。您可以通过两种方式配置批处理获取:在类级别和集合级别。

类/实体的批量抓取更容易理解。考虑以下html" target="_blank">示例:在运行时,一个会话中加载了25个Cat实例,每个Cat都有一个对其所有者(一个人)的引用。Person类被映射为一个代理,lazy=“true”。如果现在遍历所有CAT并对每个CAT调用getOwner(),Hibernate将在默认情况下执行25条SELECT语句来检索代理的所有者。您可以通过在人员映射中指定批量大小来调整此行为:

<class name="Person" batch-size="10">...</class>

Hibernate现在只执行三个查询:模式是10、10、5。

 类似资料:
  • 根据Hibernate留档,注释的解释如下: 在嵌入式id对象中,关联表示为关联实体的标识符。但您可以通过@MapsId注释将其值链接到实体中的常规关联。@MapsId值对应于包含关联实体标识符的嵌入式id对象的属性名称。在数据库中,这意味着客户。用户和客户ID。userId属性共享相同的基础列(本例中为user\u fk)。 它还说: 虽然JPA不支持Hibernate,但它允许您将关联直接放置

  • 我试图理解JPA中注释的属性。我创建了以下示例,其中客户有一个订单列表: 现在,当我使用Hibernate生成表时,我看到Hibernate只创建了2个表: 另外,如果我试图保存一个客户和一些订单,我会看到下面由Hibernate生成的DML语句: 为什么hibernate尝试在TBL_ORDER中插入和更新记录,而不是仅仅运行一个插入查询? 现在,如果我删除mappedBy属性并尝试生成表,那么

  • 我已经阅读了很多资料,但对于hibernate二级缓存,我无法消除一个疑问。 1) 比方说,我有一个返回1000条记录的查询。(例如,从年龄 2) 场景2。假设我执行查询(例如,从年龄

  • 我在每次迭代中都创建一个新线程。并且每个线程都在创建后立即启动。线程调用一个方法“doSomething()”,该方法Hibernate1秒并打印到控制台。我还在for循环中启动线程后打印一条语句,但在打印一次之后,它会在创建所有线程之前先打印所有这些语句。 输出看起来像- 我在想为什么它会输出成这样?为什么在启动thread==“+i”语句之前打印“system.out.println(”“在启

  • 我正在进行一个在线课程,其中一个问题要求我们根据列表中的索引将名称与基于以下列表和字典的关键字的理解中的工资相匹配: 期望输出: 我写了以下内容: 返回一个空集。 有人能给我一两个提示(不是代码答案)如何解决这个问题吗? 谢谢

  • 我正在浏览关于双向关系的Hibernate文档,文档中说: 例7.21。双向一对多,多对一为协会所有者 部队通过部队财产与士兵有双向的一对多关系。您不必(不得)在mappedBy side中定义任何物理映射。 要将双向一对多映射为一对多,并将一对多的一端作为拥有端,您必须删除mappedBy元素,并将多对一@JoinColumn设置为可插入且可更新为false。此解决方案未经优化,将生成其他更新语