2012-02-02 14 views
0

SINGLE_TABLE戦略を持つJPAエンティティで継承に問題があります。 gettersで@Discriminatorは継承の範囲を減らします。JPAでSINGLE_TABLE戦略を継承し、ゲッターで@Discriminatorを継承する

私は、次の構造を有する:

@Entity 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="type") 
@DiscriminatorValue("A") 
class A { 
... 
} 

@Entity 
@DiscriminatorValue("B") 
class B extends A { 
... 
} 

@Entity 
@DiscriminatorValue("C") 
class C extends B { 
... 
} 

@Entity 
class Something{ 
@ManyToMany // blah blah 
private List<B> listB; // getters and setters 
} 

問題は以下の通りです。私はクラスCのオブジェクトを持っています(継承CもBであると仮定します)。私がやっているとき:

私はクラスBのオブジェクトだけをフェッチしますが、Cはありません。しかし、CもBを拡張するのでリストにもなければなりません。 ゲッターは、このようなクエリを構築:

SELECT t1.id, t1.type, t1.sys_modified_date, t1.sys_created_date, t1.name, t1.shortName 
FROM something_b t0 INNER JOIN A t1 ON t0.listB = t1.id 
WHERE t0.news = ? AND t1.type = ? 
[params=(long) 205, (String) B] 

問題は、このゲッター(Something.getListBが)のみ(弁別器Bによって)クラスBにこのリストを減らすことです。これにより、オブジェクトクラスCがリストにないことになります。 @Discriminatorによって厳密な型 "t1.type = B"が指定されたために発生します。 "t1.type IN(B、C)"のようなセット/リストをそこに置くことはできません。

カスタムJPQLクエリは異なる方法で構築物で:

SELECT t1.id, t1.type, t1.sys_modified_date, t1.sys_created_date, t1.name, t1.shortName 
FROM something_b t0 INNER JOIN A t1 ON t0.listB = t1.id 
WHERE t0.news = ? AND t1.type IN (?, ?) 
[params=(long) 205, (String) B, (String) C] 

と彼らが必要として、彼らが働きます。しかし、ゲッターはどうですか?

興味深いが、私はクラス(すべてのベース)にBクラスから何かのクラスを変更することは事実である: @Entity クラスサムシング{ @ManyToMany //何とか何とか プライベートリストLISTA。 // getters and setters }

これは問題を解決します。 getterのクエリ:

SELECT t1.id, t1.type, t1.sys_modified_date, t1.sys_created_date, t1.name, t1.shortName 
FROM something_b t0 INNER JOIN A t1 ON t0.listB = t1.id 
WHERE t0.news = ? 
[params=(long) 205] 

「AND t1.type =?」と表示されます。それは機能しますが、 "実世界のオブジェクト"から "ORMのエンティティ"へのマッピングを妨げます。その解決策は、その抽象化を悪化させる。それはエレガントな解決策ではありません。

質問:

どのように私はこの問題を解決することができますか?

getterでカスタムJPQLクエリを使用できますか?

BゲッターとBゲッターを強制的にフェッチする方法はありますか?

変更するのではなく、別の命題がありますか?

答えて

0

どのJPAプロバイダをお使いですか?バグのように聞こえる。これはEclipseLinkでも有効です。

+0

バージョン2.1.0ではOpen JPAを使用しています。あなたはバグの感覚で他のJPAプロバイダとの経験がありますか? – Mariomario85