6

のスーパークラスから派生したい場合MappedSuperclassとの違いは何ですか。のデータベースにテーブルが作成されないことはわかっています。「抽象エンティティは具体的なエンティティに似ていますが、インスタンス化することはできません」というドキュメントを読みました。それらはインスタンス化できないため、データベースに一致するテーブルがないと推測します。私は正しいですか?Entity Abstract ClassHibernateHibernateMappedSuperclassJavaEE

MappedSuperclassもしそうなら、実質的に aと anの使用の違いはEntity Abstract Class何ですか? また、それぞれの場合のソフトウェアとデータベースへの影響は何ですか?

4

1 に答える 1

19

MappedSuperclass は、フィールドとコードの再利用のために継承を使用します。たとえば、すべてのエンティティにLong idとフィールドを持たせたい場合は、これらの 2 つのフィールドとゲッター、セッターなどを含むアノテーションが付けられLong versionたクラスを拡張することができます。しかし、関連付けを持つエンティティは決してありません。 BaseEntity の場合: 関連付けは常に BaseEntity の特定のサブクラスとなります。BaseEntityMappedSuperclass

親エンティティは「エンティティ ポリモーフィズム」に使用されます。たとえば、MessageanEmailMessageと aの 2 種類があると想像できますSmsMessage。両方とも、ソース、ターゲット、およびボディを含みます。ただし、EmailMessage には電子メール アドレスと件名があり、SmsMessage には電話番号があります。

Personまた、タイプ の送信済みメッセージのコレクションを含むエンティティがあると想像できますMessage。コレクションには、実際には EmailMessage と SmsMessage のインスタンスが含まれます。Hibernate は、継承マッピングに使用される継承戦略に応じて、インスタンス化するものを決定します。

  • すべてのメッセージを同じテーブルに格納でき、Hibernate はメッセージのタイプを含む識別子列を使用します。
  • EmailMessage を 1 つのテーブルに格納し、SmsMessage を別のテーブルに格納できます。
  • または、両方のエンティティ (ソース、ターゲット、本文) に共通のフィールドを共通テーブルに格納し、EmailMessage に固有のフィールドを 2 番目のテーブルに格納し、SmsMessage に固有のフィールドを 3 番目のテーブルに格納します。
于 2013-05-19T17:53:03.480 に答える