Hibernate文档在@BatchSize上提供了一些信息,如:
@BatchSize指定一个“批处理大小”,用于按标识符获取该类的实例。尚未加载的实例一次加载批处理大小(默认为1)。
当我们需要使用这个注释时,我不清楚这个注释的目的是什么。能帮我理解一下什么时候使用这个注释吗?
发布于 2014-11-10 11:49:53
使用批取,如果访问一个代理,Hibernate可以加载几个未初始化的代理。批取是延迟选择取取策略的一种优化。可以配置批获取的两种方法:类级和集合级。
批获取类/实体更容易理解。考虑以下示例:在运行时,一个会话中加载了25个Cat实例,并且每个Cat都有一个对其所有者Person的引用。Person类使用代理lazy="true“映射。如果您现在遍历所有猫并对每个猫调用getOwner(),Hibernate默认情况下将执行25条SELECT语句来检索代理所有者。可以通过在Person映射中指定批处理大小来优化此行为:
<class name="Person" batch-size="10">...</class>Hibernate现在只执行三个查询:模式为10、10、5。
发布于 2014-08-10 07:44:29
@BatchSize将根据您的大小从db中获取记录。假设您的结果中有100条记录,如果将批处理大小定义为10,那么它将在每db调用中获取10条记录。从逻辑上讲,它将提高性能。
发布于 2022-05-16 09:59:35
假设您知道要满足某个请求,您必须从数据库中选择一个特定的人以及她所有的猫。由于急切的加载被认为是代码嗅觉和万恶之母,这种关联将是懒惰的-您仍然希望在一个select语句中加载Person和她所有的Cat实体。
您有几种方法可以做到这一点:通过使用命名实体图或动态图,或者在JPQL或条件API中指定一个"join“。问题解决后,您将得到一个显式的加载select语句,该语句可以在一步内加载所有内容。
如果你想询问属于这个人的猫、狗、老鼠、狮子和鹦鹉怎么办?假设所有不同的物种都是单独的实体(有它们自己的表),您将得到一个包含太多JOIN FETCH子句的查询,因此无法生效。在这种情况下,“热切加载”通过上述方式是没有帮助的。
但是,在延迟加载的情况下,Hibernate将为每个动物发出一个选择(创建N+1问题)。在这种情况下,BatchSize可以作为一种补救措施。您可以告诉Hibernate一次选择多个动物(可能是同一种动物)。例如,如果您能够猜出一个人通常有多少个动物(同类型的),您可以将其设置为Hibernate的BatchSize,最后只需对每种动物进行一个查询。
如果您想查看查询(这些批处理查询使用IN子句Hibernate ),您可以在Thorben的站点上找到一个简单而简短的示例:https://thorben-janssen.com/hibernate-tips-how-to-fetch-associations-in-batches/
https://stackoverflow.com/questions/25210949
复制相似问题