2

別のエンティティから継承する 3 つのエンティティがあります。戦略 Single_Table を使用しています

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

たとえば、クラス B、C、および D は A から継承します

エンティティ B で、別のエンティティ X を熱心にロードしています。残念ながら、Hibernate は私のアノテーションを無視し、エンティティ B ごとに選択を作成してエンティティ X をフェッチします。

@ManyToOne(fetch=FetchType.EAGER)
private Projekt projekt;

私の select ステートメントは次のようになります。

いくつかのコード例:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DType", discriminatorType = DiscriminatorType.STRING, length = 3)
public abstract class A {}


@Entity
@DiscriminatorValue(B.PREFIX)
public class B extends A {

   @ManyToOne(fetch=FetchType.EAGER)
   private Projekt projekt;
}

今、私は Hibernate が A から継承するすべてのクラスを照会することを期待しています。残念ながら、結果行ごとに選択ステートメントを実行して「projekt」を照会することも避けたいと思います。

4

2 に答える 2

1

Hibernate は、 の HQL/JPQL から生成された SQL クエリに結合を挿入しませんFetchType.EAGER

挿入joinするには、明示的に指定する必要があります。この関係が他のサブクラスに存在しないという事実にもかかわらず、left join fetch問題は発生しないと思います。InheritanceType.SINGLE_TABLE

from A a left join fetch a.projekt
于 2011-12-20T11:45:28.093 に答える
0

何をしたいですか?「from A」を実行すると、継承されたすべてのタイプのエンティティがフェッチされます。B、C、D をフェッチし、次に B に対して X を熱心にフェッチする SQL クエリを作成することはできません (または少なくとも簡単ではありません)。

多くのクエリを避けるために、関連付けに BatchSize を設定できます。これにより、B ごとに 1 つのクエリを実行する代わりに、バッチでの X の読み込みが最適化されます。

Bエンティティのみに関心がある場合は、クエリを「from B」として記述できます。この場合、関連付けは積極的にフェッチされます。

于 2011-12-20T11:14:15.303 に答える