2

MySQL データベースに複数のテーブルがあります。それらが次のように見えるとしましょう:

  • 本:

    title, subject, publisher, book_author
    
  • ジャーナル:

    title, subject, publisher, journal_name
    
  • ブログ:

    title, subject, website, blog_author
    
  • Eニュース:

    title, subject, website, news_paper_name
    

特定の構造は問題とは無関係です。実際には、すべてのテーブルが共有する約 20 の列と、少数または 1 つのテーブルに固有の列があります。ポイントは、それらはすべていくつかの列を共有するということです。注釈付きのクラスを使用して、Hibernate を使用してこれらにアクセスしたいと考えています。それぞれがアクセサーとミューテーターを持つ 20 以上の冗長なフィールドを持つ 5 つ以上のクラスを持ちたくありません。次のようなクラス構造が必要です。

  • アブストラクト Publication{タイトル、件名}
    • アブストラクト PrintPublication{出版社}
      • Book{本の著者}
      • Journal{ジャーナル名}
    • アブストラクト Online Publicaiton{ウェブサイト}
      • Blog{ blog_author }
      • ENews{ news_paper_name }

しかし、私は一生、これを機能させる方法を理解できません。各具象クラスは、データベース内の単一のテーブルです。解決策はクラスごとのテーブル ( ) になると思っていました@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)が、興味深いエラーがいくつか発生しました。

このすべてに対する適切な解決策は何ですか? テーブル構造の変更に加えて。データベースは私のものではなく、変更する権限がありません。

4

1 に答える 1

4

エンティティ間の型継承が必要ない場合、その目的のためにMappedSuperClassがあります。アイデアは、すべての共通の永続属性を定義し、マップされたスーパークラスでそれらのマッピングを定義し、エンティティがそれを拡張することです。

その結果、マッピングはマッピングされたスーパークラスを拡張するエンティティに適用されますが、永続性の観点からは、エンティティとマッピングされたスーパークラスの間に is-a 関係はありません。

以下に出発点を示します。

@MappedSuperclass
public class Publication {
    String title;
    @Column (name="subject_of_publication")
    String subject;

    ...
}

@MappedSuperclass
public class PrintPublication extends Publication {
    String publisher;
    ...
}

@Entity
public class Book extends PrintPublication {//inherits persistent attributes
    ...
    String author;
}

エンティティ階層の他のレベルにスーパークラスをマップし、必要に応じてエンティティのマッピングをオーバーライドすることもできます。

しかし、たとえば Book と Blog を 1 つのタイプとして何らかの点で脅威を与える必要がある場合、マップされたスーパークラスはクエリを実行できないため、適切ではありません。

于 2012-06-15T20:34:36.183 に答える