次の階層があります
@MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Order {
...
@Entity
@Table(name = "b_order", schema = "public")
public class BOrder extends Order implements java.io.Serializable {
...
@Entity
@Table(name = "s_order", schema = "public")
public class SOrder extends Order implements java.io.Serializable {
Tr が両方の具体的なサブクラスへの参照を持つクラスもあります
@Entity
@Table(name = "tr", schema = "public")
public class Tr implements java.io.Serializable {
...
private SOrder sOrder;
private BOrder bOrder;
...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "s_order_id", nullable = false)
public SOrder getSOrder() {
return this.sOrder;
}
... same for BOrder
上記のように定義されたクラスを使用すると、遅延読み込みが正常に機能します。
Tr foundTr = trDAO.findById(trId);
// test lazy loading BOrder, SOrder
BOrder foundBOrder = foundTr.getBOrder();
SOrder foundSOrder = foundTr.getSOrder();
assertNotNull(foundSOrder);
assertNotNull(foundBOrder);
しかし、多態的なクエリを実行しようとしてもうまくいきません:
public List<Order> getOrdersByUId(Long uId) {
return (List<Order>) em.createQuery( //
" select o from Order o " //
+ " order by o.created desc ") //
.getResultList();
エラーが発生します:
注文がマッピングされていません
この投稿に基づく: http://java.dzone.com/articles/jpa-implementation-patterns-mapping
ところで、Hibernate プロキシを使用する場合、上記の 3 つの戦略のいずれかでマップされたクラスを遅延ロードすると、常にスーパークラスのインスタンスであるプロキシが返されることに注意してください。引用符
これは、私が見ている奇妙な動作と一致します。
ただし、ここからが奇妙になります。親クラスを
@Entity
// @MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Order {
つまり、MappedSuperClass アノテーションをコメント アウトすると、ポリモーフィック クエリが機能します (正しいユニオンが作成されます)。問題は、Tr から 2 つのサブクラスへの LAZY ロードが機能しなくなることです。
何か案は?JPA の代わりにネイティブ クエリを使用してユニオンを実行できますか?
Hibernateを使用してJBoss 6.0.0でJPA 2.0を使用しています-JBossに同梱されているバージョンは何でも