пружинная загрузка jpa manyToOne (column = "FatherId") присоединение к одной и той же сущности работает рекурсивно, пока FatherId не станет нулевым - PullRequest
0 голосов
/ 31 октября 2018
Entity{
    String code;
    String parentCode;
...
    @ManyToOne
    @JoinColumn(name="parentCode",referencedColumnName="code")
    Entity parentEntity;
}

Мой класс сущностей такой. то, что я хочу сделать, это использовать findAll (), чтобы получить список сущностей, где каждая сущность получает своего прямого родителя. Но весной jpa получит родительского родителя до корня, мне нужно этого избегать. Спасибо!

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Речь идет не о Spring JPA, а о самой JPA. При добавлении отношения применяются следующие значения по умолчанию, если не указано иное.

@xxToOne - FetchType.EAGER

@xxToMany - FetchType.LAZY

Итак, в вашем примере у вас есть @ManyToOne, который имеет выборку по умолчанию EAGER и один запрос на присоединение добавляется. Если у вашего родителя есть еще один @xxToOne, он добавляет еще одно объединение и так далее. Хорошо знать границы ваших сущностей и решать, какой тип FetchType необходим.

Даже если вы добавите вот так:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="parentCode",referencedColumnName="code")
Entity parentEntity;

.. если у вашего родителя больше отношений, возможно, вы загружаете все, когда выбираете родителя. Таким образом, все отношения должны быть ленивыми. Это выбор дизайна, основанный на сущностях.

Но помните о проблеме N + 1 от ORM : JPA Hibernate n + 1 проблема (Lazy & Eager Diff)

0 голосов
/ 31 октября 2018

Поскольку тип выборки по умолчанию для отношения @ManyToOne равен FetchType.EAGER Я думаю, что вы просто добавили тип выборки как LAZY явно:

Entity{
    String code;
    String parentCode;
...
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="parentCode",referencedColumnName="code")
    Entity parentEntity;
}
...