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



给定这样的映射超类。

我的查询导致一旦执行getResultsList(),JPA就会加载每个映射类。

我没有访问与订单或车辆相关的任何属性,但它们都立即被延迟加载?

@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个查询都被执行,以获取所有的惰性值?我在所有必要的类上都设置了断点,但无法解决。

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

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

最新更新