【发布时间】:2016-04-12 09:36:40
【问题描述】:
我有一份项目清单和一份客户清单。一个项目可以针对一个客户,每个客户可以有多个项目。所以这是一个简单的 1:n 关系,项目是拥有方。
简化到本质
@Entity
public class Project {
@Id
long id;
@ManyToOne(optional = true)
@JoinColumn(name = "customer", nullable = true, updatable = true)
Customer customer;
}
@Entity
public class Customer {
@Id
long id;
}
当我加载项目列表时,我想同时有效地检索客户。不是这种情况。项目只有一个查询,然后针对遇到的每个不同客户发出一个单独的查询。
假设我有 100 个项目分配给 50 个不同的客户。这将导致对项目进行一次查询,对客户进行 50 次查询。
这很快就会增加,对于大型项目/客户列表,我们的应用程序变得相当慢。这也只是一个例子。我们所有有关系的实体都会受到这种行为的影响。
我已经按照 here 的建议在 customers 字段上尝试了 @Fetch(FetchMode.JOIN),但它什么也没做,并且根据 Hibernate,FetchMode.SUBQUERY 不适用:
org.hibernate.AnnotationException:在 ToOne 关联中不允许使用 FetchMode.SUBSELECT
我该如何解决这个问题?
【问题讨论】:
-
我不认为这是一个 N+1 问题,您的
@ManyToOne关系的默认 fetch-type 已经是FetchType.EAGER
标签: java hibernate jpa query-performance