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ゲッターを強制的にフェッチする方法はありますか?
変更するのではなく、別の命題がありますか?
バージョン2.1.0ではOpen JPAを使用しています。あなたはバグの感覚で他のJPAプロバイダとの経験がありますか? – Mariomario85