2011-12-20 13 views
1

私は3つのエンティティを別のエンティティから継承しています。私は、例えばSINGLE_TABLE戦略Hibernateは単一継承のFetchTypeを無視します

@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 

を使用してい クラスB、CおよびDはAから継承します

エンティティBでは、別のエンティティXを熱心に読み込んでいます。残念ながら、Hibernateは私の注釈を無視し、実体X.

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

をフェッチするためにB各エンティティの選択を作成し、次のように私のselect文に見えます:A'から 'selectのA

いくつかのより多くのコード例:

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

は、今私はそれがないAからinheriteすべてのクラスを照会するために休止状態を期待しています。残念ながら、私は回避したい "projekt"を照会するために各結果行に対してselectステートメントも実行します。

+0

SELECT文があります有効なJPQLではありません。あなたは "a a from a a"ではないと確信していますか? Hibernateがselectを生成して各Bに対してXをフェッチする場合、アノテーションは無視されません。Xは賢くフェッチされます。 –

+0

ありがとう、私は例を変更しました。私はできるだけ簡単にしようとしました。 – Daniel

答えて

1

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

明示的left join fetchを指定する必要がjoin挿入するために、私はそれがこの関係は、他のサブクラスには存在しないという事実にもかかわらず、InheritanceType.SINGLE_TABLEに問題を作成しません推測:

from A a left join fetch a.projekt 
0

何をしたいですか? "from A"を実行すると、継承されたすべての型のエンティティを取得しています。 B、C、DをフェッチするSQL問合せを作成し、次にBがXを熱心にフェッチすることはできません(または簡単には簡単ではありません)。何をしたいのですか?

多くのクエリを避けるために、関連付けに対してBatchSizeを設定できます。これにより、各Bの1つのクエリではなく、バッチでのXの読み込みが最適化されます。

Bエンティティのみに興味がある場合は、クエリを「from B」として記述できます。この場合、関連が熱心に取得されます。

+0

私は質問を更新しました。私はすべてのエントリを取得したい。これは正しく動作します。しかし、私はタイプBの各行に対してメンバーprojektを照会する別のselectステートメントを望んでいません。これらの注釈をすべて使用しようとしましたが、無視されます。 – Daniel

関連する問題