eclipselink 加载 n+1 个关联,即使它们被标记为 FetchType.LAZY

eclipselink loading n+1 associations even though they are marked as FetchType.LAZY

给定一个像这样的映射超级 class。

我的查询导致 JPA 在执行 getResultsList() 后立即加载每个映射的 classes。

我没有访问与 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;
}

每个class都有具体的实现。

使用 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 个查询都被执行并获取了所有惰性值? 我已经在所有必要的 classes 上设置了断点,但无法弄清楚。

一些惰性关系(如 OneToMany 和 ManyToOne)需要编织,并启用其他性能增强功能,如获取组和更改跟踪,如 https://www.eclipse.org/eclipselink/documentation/2.5/concepts/app_dev007.htm

所述

编织通常在 EE 7 容器内自动发生,但需要额外的步骤才能在容器外或非 EE7 容器中运行。