首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@ManyToOne和@BatchSize

@ManyToOne和@BatchSize
EN

Stack Overflow用户
提问于 2012-10-24 11:36:03
回答 3查看 18.5K关注 0票数 9

我在一些旧代码中发现了一些奇怪的东西(至少对我来说是这样)。

带注释的@ManyToOne字段也用@BatchSize注释。

我一直认为@BatchSize注释只会在类级或集合(@OneToMany)上进行注释,而在迭代时会影响预取

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

@BatchSize注释@ManyToOne有意义吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-24 12:01:54

只有当相应的字段被标记为@ManyToOne (lazy=true)时,与@BatchSize关联的lazy才有意义。

实际上,如果字段不是lazy,则定义它已经加载,因为已加载了封闭实体,因此数据库调用问题不适用。

假设有一个Person类拥有一个ShoesPair元素集合(ShoesPair.class),在这个类中有一个owner字段被标记为懒惰(因为它是可选的,并且在检索特定的鞋子时并没有真正带来重要的信息)。

一个人想要迭代25对鞋(25个ShoesPair对象),以便检索它们的所有者。

如果owner字段(对应于一个人)仅使用@ManyToOne注释,则将出现25 select数据库。

但是,如果使用@BatchSize(size=5)进行分析,只会出现5调用,从而提高性能。

Hibernate文档中可以看出,批处理大小不仅适用于集合:

您还可以使用实现集合的批取。

Hibenate特别提到了@OneToMany案例,因为这些案例被应用于90%的案例中标记为lazy的字段中。

票数 6
EN

Stack Overflow用户

发布于 2013-12-20 12:09:52

我认为这个问题指的是@ManyToOne@BatchSize在同一个领域的结合,例如:

代码语言:javascript
复制
@ManyToOne
@BatchSize(size = 5)
private User owner;

Hibernate不支持此用例,至少在使用注释时是如此。文档提到的批取的唯一用途是:

  • 关于集合字段,即@OneToMany@ManyToMany (但不是@ManyToOne)
  • 关于要获取的实体类

例如:

代码语言:javascript
复制
@Entity
@BatchSize(size = 5)
public class User {
  ...
}

后一种情况允许对类型用户的所有关系进行批处理,包括多对一关系。但是,有了实体类上的注释,就不可能在逐字段的基础上控制行为。

在Hibernate源代码中搜索@BatchSize的所有用途,就可以证实对您的使用缺乏支持。从我在AnnotationBinder.java中看到的情况来看,@BatchSize注释只在实体类和具有某种@XxxToMany注释的字段上进行检查。

票数 19
EN

Stack Overflow用户

发布于 2017-07-25 12:46:18

用Hibernate解决N+1查询问题

1在fetchMode中使用条件查询

标准= session.createCriteria(Customer.class);criteria.setFetchMode("contact",FetchMode.EAGER);

2 HOL取料连接

3 @BatchSize

@BatchSize注释可用于定义要在单个数据库查询中填充多少相同的关联。如果会话有100个客户附加到它,并且“contact”集合的映射被注释为大小为n的@BatchSize。这意味着每当Hibernate需要填充一个惰性联系人集合时,它会检查会话,如果它有更多的客户需要填充他们的联系人集合,那么它将获取n个集合。

代码语言:javascript
复制
@OneToMany(mappedBy="customer",cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    @BatchSize(size=25)
    private Set<Contact> contacts = new HashSet<Contact>();
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13048436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档