2011-11-30 8 views
6

私はクラスを永続化するためにHibernateアノテーションを使用しています。 は現在、私は私が親クラスである抽象クラスを持つクラス Hibernate Polymorphic HQL SELECT文

をマッピングするために、次の戦略を使用している、と私はそれ 母、父から継承する二つのサブのクラスを持っています。

私はそのようにマッピングされた:

@MappedSuperclass 
public abstract class Parent { 

private int age; 
private String name; 
... 
} 

そして他の二つのクラスがこのように宣言されています

@Entity 
public Class Father extends Parent { 

private boolean haveMustash; 
... 
} 

したがって、基本的なシナリオは、「クラスごとの表」です。

今、親(親、父)に関係なく、親の年齢を更新するHibernate HQLステートメントを作成します。両方のテーブルで一意の名前列を使用して親が検索されます。母親や父親なら名前を見るだけではわかりません。 両方のテーブルを参照し、更新するために正しいエンティティを返すHQL文を作成するにはどうすればよいですか?

私はこのような何かについて考えた:(それも可能であれば私はアイデアを持っていない)

Parent parent = hibernateTemplate.find("from Mother,Father where name=" 
     + name); 

答えて

2
from Parent p where p.name = :name 

(テストされていません)。

スーパークラスからマップされた属性を継承する点を除いて、両方のエンティティに共通点がないため、2つのクエリには2つのクエリが使用されます。ここではエンティティの継承はなく、クラスごとの戦略を実装しないでください。 Parentに@MappedSuperClassではなく@Entityが注釈され、@Inheritanceを使用して継承ストラテジーを定義した場合は、

+0

それは動作しません、私は親がマップされていません(ハイバーネーション例外) – stdcall

+0

さて、マップしてください。 –

+0

全体アイデアはマッピングされていないため、抽象クラスであり、Father&Motherはそこから基本マッピングを取得します。 – stdcall

-1

これはHibernate Referenceによると機能しています!

複数のクラスが表示され、デカルト積または "クロス"結合が発生する可能性があります。

from Formula, Parameter

(14.2を参照)

Hibernate Reference

また、別々に両方のテーブルに検索し、ヌルされていない1つのチェックだろうか?

1

JBニジェットの答えは正しいです。 @MappedSuperclassではなく、@Entityを使用して親をマップします。これにより、ParentでHibernateのクエリと更新を実行できます(後者では、父と母親だけで実行できます)。クラスあたりのテーブルは@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)アノテーションで保持できます。

from Mother,Fatherは暗黙的にテーブルに参加するため、機能しません。あなたが望むのは組合です。 @Entityを使って、Hibernateはこれを自動的に行います。

+0

をよく読んでください。 Hibernateがその仕事を完了させるためには、継承情報をParentクラスに追加する必要があります。 – germanio