@ManyToOne和@BatchSize

时间:2012-10-24 11:36:04

标签: java hibernate hibernate-mapping hibernate-annotations

我在一些旧代码中找到了奇怪的东西(至少对我而言)。

注释@ManyToOne的字段也标有@BatchSize

我一直认为@BatchSize注释仅影响在课程级别或集合(@OneToMany)注释时,并在迭代时影响预取

但也许我错了,用@ManyToOne注释@BatchSize会影响某些事情。我在文档中找不到答案。

使用@ManyToOne注释@BatchSize是否有意义?

3 个答案:

答案 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";