1

Hibernateでサブクラスをネストするにはどうすればよいですか?

たとえば、次のクラス階層があります。

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

これは理想的なオブジェクト構造です。Hibernateを使用してこれを正常にマッピングするにはどうすればよいですか?PageQuestion抽象クラスは非常に重要だと思います。再利用可能なプロパティとロジックが多数含まれています。PageQuestionまた、参照しないで具体的に参照する必要がありますPageElement<-これは悪いことです。PageQuestionまた、すべてのオブジェクトに対してクエリを実行したいと思います。

4

2 に答える 2

1

Hibernate 4.0 (おそらくそれ以前) では、table-per-hierarchy モデルを使用している場合、ネストされた要素を使用できます。

クラス構造の例:

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();

データベースには、最終的に次の情報が含まれます。

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();

版画:

test.Word@caf6c1
test.Subject@10e35d5
test.ProperNoun@18e8541
test.Pronoun@1ce85c4
test.Verb@17aece8

http://docs.jboss.org/hibernate/core/4.0/manual/en-US/html/inheritance.htmlのセクション 10.1.1 を参照してください(基本的に古いドキュメントと同じですが)。ネストされたサブクラスが許可されていることを明確に示していませんが、実験するのは簡単です。

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

于 2013-07-03T17:47:45.667 に答える
0

それはまさにオブジェクトとリレーショナル パラダイムの間の問題です。

Hibernate はそのためのツールです。そして、あなたはすでにこれについての参照を持っています。

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

于 2011-12-11T14:08:24.577 に答える