1

次の階層があります

@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に同梱されているバージョンは何でも

4

1 に答える 1

1

MappedSuperClass のクエリに失敗してもおかしなことは何もありません。JPA 2仕様によると:

2.11.2 マップされたスーパークラス .... エンティティとは異なり、マップされたスーパークラスはクエリ可能ではなく、EntityManager またはクエリ操作に引数として渡してはなりません。マップされたスーパークラスによって定義される永続的な関係は、一方向でなければなりません。....

あなたが投稿したコードの空白を埋めました (@MappedSuperClass なし)。ポリモーフィック クエリと遅延読み込みの両方が Hibernate 3.5.6-Final で動作するようです。たぶん、コードの欠落部分に関しては、別の方法で作成したのでしょう。さらに完全な例を投稿できますか?

于 2011-09-18T13:07:56.683 に答える