bugfix> java > 投稿

私は Bp から怠zyな1:n関係を持っています BpHistorisiert へそして、私はJPAにこの領域を熱心にロードするように伝えていません。

BpHistorisiert をロードするためにフェッチ結合を行う基準クエリがあります Bp と一緒に 。

残念ながら機能していません、 BpHistorisiert はありませんインスタンスはすべてロードされます。ザ・ bpHistorisiertListBp 残りは空です。

これは、基準APIによって生成されるJPQLクエリです。

SELECT * FROM Bp b LEFT JOIN FETCH b.bpHistorisiertList

JPAはこのSQLクエリを生成しています:

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;

DBでこのクエリを実行すると、正しいデータが取得されます。

Bp

@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<>();
}

BpHistorisiert

@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;
}

問い合わせ

   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();

回答 1 件
  • 結局、これは永続コンテキストのライブサイクルの問題であることが判明しました。エンティティの定義と基準クエリはまったく問題ありません。

    バックグラウンド

    この特定のケースでは、手作りのテストJEEコンテナは永続コンテキストをクリアしません。さらに、DB初期化コードは、BpとBpHistorisertの間の双方向関係の両側を設定しませんでした。これにより、エンティティマネージャは、DBからすべてを最初から読み取るのではなく、永続コンテキストから壊れたBpからBpHistorisertの関係を処理しました。

あなたの答え