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

时间:2018-11-26 15:06:33

标签: java jpa eclipselink

给出这样的映射超类。

我的查询导致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 :(得分:1)

https://www.eclipse.org/eclipselink/documentation/2.5/concepts/app_dev007.htm

所述,对于某些懒惰的关系(如OneToMany和ManyToOne),还需要进行编织,并启用其他性能增强功能,如访存组和更改跟踪。

编织通常在EE 7容器内自动进行,但需要额外的步骤才能在容器外部或非EE7容器中起作用。