2009-05-27 19 views
7

私は、オブジェクト型がいくつかありうるフィールドを持つオブジェクトを持っています。このオブジェクトは、フィールドのサブタイプの識別子カラムを持つ単一のテーブルにエンコードされます。これらのサブタイプのそれぞれは、そのフィールドが親オブジェクト表の列にマップされています。私はこれを冬眠中にモデル化することはできません。コードにはgetSubfield()のサブタイプのデータがテーブルにあるかどうかにかかわらずヌルが返されます。Hibernate組み込み可能な継承

スキーマ

 
    id type whosit whatsit 
+----+------+--------+---------+ 
| 1 | "A" | "test" | null | 
| 2 | "B" | null | "test" | 
+----+------+--------+---------+ 

ドメインが

@Entity 
public class Parent { 
    protected @Id @GeneratedValue int id; 
    protected Subfield subfield; 

    public Subfield getSubfield() {return subfield;} 
} 


@Embeddable 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="type", discriminatorType=DiscriminatorType.STRING) 
public abstract class Subfield {} 


@DiscriminatorValue("A") 
public class TypeA extends Subfield { 
    public String whosit; 
} 


@DiscriminatorValue("B") 
public class TypeB extends Subfield { 
    public String whatsit; 
} 

オブジェクト

{id=1,subfield=null} 
{id=2,subfield=null} 

"親PからPを切り替えるには、" それはpossibです私がこのオブジェクトモデルで望むものを達成するために、あるいは私は少し創造的にする必要がありますか(これは従来のデータベースです。スキーマの変更は好ましくありません)

+1

職場の同僚は私にhttp://opensource.atlassian.com/projects/hibernate/browse/HHH-1910を教えてくれました。私はそれがサポートされていないと思う= \ –

答えて

3

あなたは簡単にスキーマを変更することはできません。いくつかのビューを追加するのはどうですか?

+1

残念なことに、それはまだデータベース構造の変更です。私はコードでこれを解決しようとしています。もし何も残っていなければ、それは冬眠ができるもののように思え、私が間違っていることに興味があります。 –

+1

+ 1あなたのコメントに+1して、時には正しいものにすることができず、悪いスキーマデザインを修正できないことを思い出させる。 :-) – cbmeeks

5

質問者が指摘したように、hibernateは埋め込み可能クラス(https://hibernate.atlassian.net/browse/HHH-1910)の継承をサポートしていません。

Eclipse Wikiによると、JPAはこの動作を指定していませんが、EclipseLinkはこれをサポートしています(http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Entities/Embeddable#Inheritance)。

私の提案は、クラス階層を完全にサブフィールド内に壊すことです。恐ろしいですが、これが解決されるまでうまくいくはずです。

1

私はこれが古いことを知っています。

これを回避する方法は、上記のとおりです。ビューを作成します。あなたはスキーマを変更したくないと言っています。そうしないでください。古いスキーマをマップし、必要な処理を実行する新しいスキーマを作成できます。 (おそらくデータベースに依存します)

関連する問題