У меня есть список проектов и список клиентов. Проект может быть для одного клиента, и у каждого клиента может быть много проектов. Таким образом, это простое отношение 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 запросам для клиентов.
Это быстро накапливается, и для больших списков проектов / клиентов наше приложение работает довольно медленно. Также это всего лишь один пример. Это поведение влияет на все наши сущности, имеющие отношения.
Я уже пробовал @Fetch(FetchMode.JOIN)
в поле customers
, как было предложено здесь, но это ничего не дает и FetchMode.SUBQUERY
не применяется в соответствии с Hibernate:
org.hibernate.AnnotationException: использование FetchMode.SUBSELECT не разрешено для ассоциаций ToOne
Как я могу исправить эту проблему?
@ManyToOne
отношений ужеFetchType.EAGER
- person Raphael Roth   schedule 12.04.2016