eclipselink загружает n + 1 ассоциаций, даже если они помечены как FetchType.LAZY - PullRequest
0 голосов
/ 26 ноября 2018

Учитывая сопоставленный суперкласс, подобный этому.

Мой запрос приводит к тому, что каждый из сопоставленных классов загружается JPA, как только выполняется getResultsList().

Я не обращаюсь кЕсть ли какие-либо свойства, связанные с Order или Vehicle, но они все загружаются сразу же?

@MappedSuperclass
public abstract class PimaOrderComponentORM implements Serializable, EntityWithPK<Long> {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumns(@JoinColumn(name="PIMA_ORDER_ID", referencedColumnName="ID"))
    private PimaOrderBE pimaOrder;
}

@MappedSuperclass
public abstract class PimaOrderORM implements Serializable, EntityWithPK<Long> {
    @Id
    @GeneratedValue(generator="SQ_PIMA_ORDER")
    @SequenceGenerator(name="SQ_PIMA_ORDER", sequenceName="SQ_PIMA_ORDER", allocationSize=20)
    @Column(name = "ID")
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumns(@JoinColumn(name="VEHICLE_ID", referencedColumnName="ID"))
    private VehicleBE vehicle;
}

Каждый класс имеет конкретную реализацию.

При выполнении этого запроса с использованием JPA

        String esql = "SELECT p FROM PimaOrderComponentBE p WHERE p.pimaOrder.vehicle.id in :vehicles";
        Query query = em
                .createQuery(esql)
                .setHint(QueryHints.JDBC_FETCH_SIZE, 1000)
                .setParameter("vehicles", ids);
        List<PimaOrderComponentBE> results = query.getResultList();

В этот момент выполняется 20-30 запросов, извлекающих все ленивые значения?Я поставил контрольные точки на все необходимые классы и не могу этого понять.

1 Ответ

0 голосов
/ 27 ноября 2018

Плетение требуется для некоторых ленивых отношений, таких как OneToMany и ManyToOne, и для включения других улучшений производительности, таких как группы выборки и отслеживание изменений, как описано в https://www.eclipse.org/eclipselink/documentation/2.5/concepts/app_dev007.htm

Плетение, как правило, происходит автоматически в контейнерах EE 7,но потребуются дополнительные шаги для работы вне контейнера или в контейнерах не-EE7.

...