0

CriteriaQueryに明示的に通知せずにManyToOne関係を読み込ませるのに問題があり、これを機能させるためにクエリでエンティティ注釈を複製する必要があるのは非常に奇妙に思えます。

  • JPA + Hibernate (hibernate-jpa-2.0-api) を使用するアプリケーションがあります。

  • 私のエンティティComputerは、他のフィールドとは別に、関係が含まれています。

    @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "employee", nullable = false) private Employee employee = null;

  • 私の知る限り、Computerエンティティをロードすると、それに関連するEmployeeが同じクエリに自動的にロードされるはずですが、CriteriaQueryを使用してComputerをロードすると、そのようには機能しません。つまり、javax.persistence.criteria.CriteriaQueryを作成して実行すると、次の 2 つの異なるクエリが表示されます。

    • コンピューターを取得するための 1 つ
    • 従業員を取得するための別のもの(使用する前であっても..つまり、熱心な注釈のためにこのエンティティをロードしているようです)

私の観点からは、これは同じクエリで行う必要がありますが、これを機能させるために何をすべきかわかりません。「.fetch("employee")」条件クエリに追加すると機能しますが、そのようにしてクエリのエンティティの構成を複製しているため、メンテナンスの観点からすると、これは解決策ではありません。

この動作は正常ですか?変更できますか?

ありがとう

4

1 に答える 1

1

FetchType.EAGER は、リンクされたエンティティをルート エンティティと同時にフェッチする必要があることを意味しますが、jpa 仕様では、これを行うための戦略については何も述べられていません (つまり、1 つまたは 2 つのクエリを使用するかどうかは、永続化プロバイダーの実装に任された選択肢です)。 .

@Fetch(FetchMode.JOIN)Hibernate は、 1 つのクエリで両方のエンティティをフェッチするように休止状態にすることを示すアノテーションを提供するため、それを使用して必要なものを達成できます (ただし、標準の JPA アノテーションではありません)。

于 2013-10-01T08:27:50.157 に答える