我在一些旧代码中发现了一些奇怪的东西(至少对我来说是这样)。
带注释的@ManyToOne字段也用@BatchSize注释。
我一直认为@BatchSize注释只会在类级或集合(@OneToMany)上进行注释,而在迭代时会影响预取。
但也许我错了,用@BatchSize注释@ManyToOne会影响到一些事情。我在文件里找不到答案。
用@BatchSize注释@ManyToOne有意义吗?
发布于 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的字段中。
发布于 2013-12-20 12:09:52
我认为这个问题指的是@ManyToOne和@BatchSize在同一个领域的结合,例如:
@ManyToOne
@BatchSize(size = 5)
private User owner;Hibernate不支持此用例,至少在使用注释时是如此。文档提到的批取的唯一用途是:
@OneToMany或@ManyToMany (但不是@ManyToOne)例如:
@Entity
@BatchSize(size = 5)
public class User {
...
}后一种情况允许对类型用户的所有关系进行批处理,包括多对一关系。但是,有了实体类上的注释,就不可能在逐字段的基础上控制行为。
在Hibernate源代码中搜索@BatchSize的所有用途,就可以证实对您的使用缺乏支持。从我在AnnotationBinder.java中看到的情况来看,@BatchSize注释只在实体类和具有某种@XxxToMany注释的字段上进行检查。
发布于 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个集合。
@OneToMany(mappedBy="customer",cascade=CascadeType.ALL, fetch=FetchType.LAZY)
@BatchSize(size=25)
private Set<Contact> contacts = new HashSet<Contact>();https://stackoverflow.com/questions/13048436
复制相似问题