我在一些旧代码中找到了奇怪的东西(至少对我而言)。
注释@ManyToOne
的字段也标有@BatchSize
。
我一直认为@BatchSize
注释仅影响在课程级别或集合(@OneToMany
)注释时,并在迭代时影响预取。
但也许我错了,用@ManyToOne
注释@BatchSize
会影响某些事情。我在文档中找不到答案。
使用@ManyToOne
注释@BatchSize
是否有意义?
答案 0 :(得分:14)
我认为问题涉及在同一字段上合并@ManyToOne
和@BatchSize
,例如:
@ManyToOne
@BatchSize(size = 5)
private User owner;
Hibernate不支持此用例,至少在使用注释时是这样。 documentation提到的批量提取的唯一用途是:
@OneToMany
或@ManyToMany
(但不是 @ManyToOne
)E.g:
@Entity
@BatchSize(size = 5)
public class User {
...
}
后一种情况允许对User类型的所有关系进行批处理,包括多对一关系。但是,对于实体类的注释,无法逐个字段地控制行为。
通过Hibernate源代码搜索@BatchSize
的所有用途,确认缺少对您的使用的支持。从我在AnnotationBinder.java中看到的情况来看,@BatchSize
注释仅在实体类和具有某种@XxxToMany
注释的字段上进行检查。
答案 1 :(得分:4)
@ManyToOne
(@BatchSize
)时,与lazy
相关联的 lazy=true
才有意义。
实际上,如果该字段不是lazy
,则根据定义已加载,因为加载了封闭实体,因此数据库调用的问题不适用。
想象一个Person
类,其中包含ShoesPair
元素(ShoesPair
。class)的集合,并且在此类中存在标记为lazy的owner
字段(因为可选)并且在检索特定鞋子时并没有真正提供重要信息。)
有人想要遍历 25 一双鞋子(25 ShoesPair
个对象),以便检索他们的主人。
如果owner
字段(对应于一个人)仅使用@ManyToOne
进行注释,则 25 会选择数据库。
但是,如果使用@BatchSize(size=5)
进行注释,则只会有 5 次调用,从而提高性能。
从Hibernate documentation开始,批量大小不仅适用于集合:
您可以同时启用批量抓取收藏。
Hibenate特别提及@OneToMany
个案例,因为这些案例适用于90%的案件标记为lazy
的字段。
答案 2 :(得分:-1)
使用Hibernate解决N + 1查询问题
1使用带有fetchMode的Criteria查询
标准条件= session.createCriteria(Customer.class); criteria.setFetchMode(“contact”,FetchMode.EAGER);
2 HOL获取连接
3 @BatchSize
@BatchSize注释可用于定义在单个数据库查询中填充的相同关联数。如果会话有100个客户附加,并且'contact'集合的映射使用大小为n的@BatchSize注释。这意味着每当Hibernate需要填充延迟联系人集合时,它会检查会话,如果有更多客户需要填充其联系人集合,则最多可以获取n个集合。
import {MOCKDATA} from "../path_to_mockdata";