2011-12-11 7 views
1

Hibernateでサブクラスをネストするにはどうすればよいですか?hibernateを使用してネストされたサブクラスを正しくマップする方法

例えば、私は次のクラス階層を持っている:

PageElement 
- PageParagraph 
- PageImage 
- PageVideo 
- PageAudio 
- PageQuestion 
    - PageFillInTheBlankQuestion 
    - PageOpenEndedQuestion 
    - PageMultipleChoiceQuestion 
    - ... 

は、これは理想的なオブジェクト構造です。 Hibernateを使ってこれをどのようにして正常にマップできますか?私はPageQuestion抽象クラスが非常に重要であると言います。これには、再利用可能な多くのプロパティとロジックが含まれています。私はまたPageQuestionを特に参照する必要があります。PageElement <を参照しないでください。これは悪いです。また、すべてPageQuestionオブジェクトに対して照会したいと思います。

答えて

0

ObjectとRelationalパラダイムの間の問題です。

このためのツールは、Hibernateです。そしてそこには既にこれについての参照があります。 Hibernateは4.0で

http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#d0e6906

+0

私は階層ごとのパターンでそれを行う方法を考え出しました。休止状態のファイルは、そのドキュメントに示されている例のようには見えません。文書は十分に使い果たされていません。 – egervari

1

(多分それ以前)を使用すると、テーブルごとの階層モデルを使用している場合は、ネストされた要素を使用することができます。

例のクラス構造:

Word (has property "text", string) 
- Subject (adds property "plural", boolean) 
    - Pronoun (adds property "masculine", boolean) 
    - ProperNoun (adds property "person", boolean) 
- Verb (adds property "past_tense", boolean) 

例HibernateマッピングXML:

<class name="test.Word" table="words"> 
    <id name="id"><generator class="native"/></id> 
    <discriminator column="word_type" type="string"/> 
    <property name="text"/> 
    <subclass name="test.Subject"> 
     <property name="plural"/> 
     <subclass name="test.ProperNoun"> 
      <property name="person"/> 
     </subclass> 
     <subclass name="test.Pronoun"> 
      <property name="masculine"/> 
     </subclass> 
    </subclass> 
    <subclass name="test.Verb"> 
     <property name="past_tense"/> 
    </subclass> 
</class> 

はその後、次のコードを実行した後に(私はクラスコードを残してきた、それだけで非常に基本的なと正直ですこの例ではオブジェクトタイプ自体が重要です)。

HibernateUtil.beginTransaction(); 
    HibernateUtil.getCurrentSession().persist(new Word("blue")); 
    HibernateUtil.getCurrentSession().persist(new Subject("chairs", true)); 
    HibernateUtil.getCurrentSession().persist(new ProperNoun("James", true)); 
    HibernateUtil.getCurrentSession().persist(new Pronoun("he", false, true)); 
    HibernateUtil.getCurrentSession().persist(new Verb("sat", true)); 
    HibernateUtil.commitTransaction(); 

d

id, word_type, text, plural, person, masculine, past_tense, 
1, test.Word, blue, NULL, NULL, NULL, NULL 
2, test.Subject, chairs, 1, NULL, NULL, NULL 
3, test.ProperNoun, James, 0, 1, NULL, NULL 
4, test.Pronoun, he, 0, NULL, 1, NULL 
5, test.Verb, sat, NULL, NULL, NULL, 1 

とバックの適切なタイプで結果オブジェクトの一覧を照会:

HibernateUtil.beginTransaction(); 
    List<Word> words = HibernateUtil.getCurrentSession().createCriteria(Word.class).list(); 
    for (Word w:words) 
     System.out.println(w); 
    HibernateUtil.commitTransaction(); 

プリント:

[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 

参照セクションhttp://docs.jboss.org/hibernate/core/4.0/manual/en-US/html/inheritance.htmlの10.1.1をatabaseは、この情報を含んで終わります残念ながら、入れ子にされたサブクラスが許可されていることは明確に示されていませんが、実験するのは簡単なことです(これは古い文書と本質的に同じです)。

私は、Hibernateのドキュメントが非常に整理されていないことに同意します。すべてがそこにありますが、整理された方法について何かが私に完全な情報を見つけることを非常に困難にしていることがわかります。主に相互参照の過度の使用と、すべてのベースをカバーしていないユースケース指向のレイアウトによるものです。ただし、情報です。

関連する問題