我有一个从Bp
到BpHistorisiert
的懒惰1:n关系,而且我没有告诉JPA急切地加载这个问题。
我有一个条件查询执行获取联接以与BpHistorisiert
一起加载Bp
。
不幸的是它没有工作,根本没有加载BpHistorisiert
个实例。 bpHistorisiertList
Bp
中的SELECT * FROM Bp b LEFT JOIN FETCH b.bpHistorisiertList
为空。
这是由条件API生成的JPQL查询:
SELECT t0.id,
t6.bp_id,
t6.id,
FROM infop_stammdaten.bp t0
LEFT OUTER JOIN infop_stammdaten.bp_historisiert t6
ON t0.id = t6.bp_id
ORDER BY t6.bp_id ASC;
JPA正在生成此SQL查询:
@Entity
@Table(name = "BP", schema = "INFOP_STAMMDATEN")
public class Bp extends BaseEntity implements EntityId, Serializable {
/** technische ID */
@Id
@Column(name = ID)
private Long id;
@Valid
@OneToMany(mappedBy = "bp", orphanRemoval = false, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<BpHistorisiert> bpHistorisiertList = new ArrayList<>();
}
如果我在DB中执行此查询,我会获得正确的数据。
BP
@Entity
@Table(name = "BP_HISTORISIERT", schema = "INFOP_STAMMDATEN")
public class BpHistorisiert implements EntityId, GueltigkeitOwner, AbkuerzungOwner, Serializable {
@Id
@Column(name = ID)
private Long id;
@NotNull
@ManyToOne
@JoinColumn(name = BP_ID)
@ForeignKey
private Bp bp;
}
BpHistorisiert
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Bp> bpQuery = builder.createQuery(Bp.class);
Root<Bp> fromBp = bpQuery.from(Bp.class);
fromBp.fetch(Bp_.bpHistorisiertList, JoinType.LEFT);
List<Bp> bpList = entityManager.createQuery(bpQuery).getResultList();
查询
test
答案 0 :(得分:0)
这毕竟是一个持久性上下文实时循环问题。实体定义和条件查询都很好。
背景
我们手工制作的test-JEE容器在这种特殊情况下不会清除持久性上下文。此外,DB初始化代码未设置Bp和BpHistorisert之间的双向关系的两端。这导致实体管理器从持久性上下文处理断开的Bp到BpHistorisert关系,而不是从数据库从头开始读取所有内容。