2011-12-13 2 views
1

を照会:動物および哺乳:だから、私は2つのテーブルを持っているを接合し、単一テーブル継承を混合し、私は、次の構成で動作しているWebアプリケーション(Iエンティティ名を変更)を持つすべてのオブジェクトの

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
@Table(name = "animals") 
public abstract class Animal { ... 

@MappedSuperclass 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = "type") 
public abstract class Mammal extends Animal { ... 

@Entity 
@Table(name = "mammals") 
@PrimaryKeyJoinColumn(name = "mammal_id") 
@DiscriminatorValue(value = "dog") 
public class Dog extends Mammal { ... 

@Entity 
@Table(name = "mammals") 
@PrimaryKeyJoinColumn(name = "mammal_id") 
@DiscriminatorValue(value = "cat") 
public class Cat extends Mammal { ... 

を。 方法が完全に理解できない限り、この設定は機能しています。 Mammalでは継承タイプがJOINEDからSINGLE_TABLEに変更されているため、catsとdogsはmammal_idカラムでanimalsテーブルに結合された哺乳類テーブルに保存されます。

問題はそれが多型の方法で哺乳類(猫や犬)を取得することはできないからである。

Mammal mammal = (Mammal) hibernateTemplate.get(Mammal.class, id); 

または単一のHibernateクエリで哺乳動物(犬・猫)のリスト:

List<Mammal> list = (List<Mammal>) hibernateTemplate.find("from Mammal"); 

「Mammalはエンティティではないため、「未知のエンティティ:Mammal」はマッピングされたスーパークラスです。

たとえば、以下のような構成でいくつかの変更を試みました。これは意味をなさないと思われますが、その場合は、テーブル猫と犬(存在しない)を検索するため、「エンティティを読み込めませんでした:哺乳動物」が見つかりました。

だから、
@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
@Table(name = "animals") 
public abstract class Animal { ... 

@Entity 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@Table(name = "mammals") 
@PrimaryKeyJoinColumn(name = "mammal_id") 
@DiscriminatorColumn(name = "type") 
public abstract class Mammal extends Animal { ... 

@Entity 
@DiscriminatorValue(value = "dog") 
public class Dog extends Mammal { ... 

@Entity 
@DiscriminatorValue(value = "cat") 
public class Cat extends Mammal { ... 

、要約する:私は同じように(2つのテーブル:動物や哺乳類の)作業Webアプリケーションを維持したいが、同時に多型のクエリを行うことができる:哺乳類のリストを取得する(猫および犬)に問い合わせます。

私は十分に明確であり、どんな助けでも事前に感謝したいと思います。

ANOTHER TRY:

"次のテーブルを含む外部キー円形の依存関係:"

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
@Table(name = "animals") 
public abstract class Animal { ... 

@Entity 
@Table(name = "mammals") 
@PrimaryKeyJoinColumn(name = "mammal_id") 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = "type") 
public abstract class Mammal extends Animal { ... 

@Entity 
@Table(name = "mammals") 
@DiscriminatorValue(value = "dog") 
public class Dog extends Mammal { ... 

@Entity 
@Table(name = "mammals") 
@DiscriminatorValue(value = "cat") 
public class Cat extends Mammal { ... 
+1

これを解決しましたか? – rmarimon

+0

これを解決するには? – Alex

答えて

0

あなたはhibernateTemplate.find("from Mammal")を試してみましたか?

findクエリは、のJPAエンティティである必要があります。

通常、BTWテーブルの名前は一意になります。一般に、複雑なクエリは少し良くなります。 WHERE chicken.id = egg.id

+0

ありがとう、私は、単なる例だったクエリを修正しました。これは動作中のWebアプリケーションで、データモデルが完成しました。実際には、例を簡単にするためにエンティティ名を変更しました(私は願っています)。 – Boris

関連する問題