5

ですから、この質問に対する答えを見つけるのはかなり簡単なはずなので、この質問の仕方がわかりません。

3 つのテーブルがあります。ContentHeader、ContentType1、および ContentType2。ContentHeader には、主な自動インクリメント キーがあります。ContentType1 と ContentType2 は両方とも、ContentHeader の主キーへの外部キーを維持します。これらの外部キーは、それぞれのテーブルの主キーでもあります。

CREATE TABLE contentHeader (contentID INT AUTO_INCREMENT PRIMARY KEY, ...) ENGINE=InnoDB;

CREATE TABLE contentType1 (contentID INT PRIMARY KEY, FOREIGN KEY (contentID) REFERENCES contentHeader (contentID), ...) ENGINE=InnoDB;

CREATE TABLE contentType2 (contentID INT PRIMARY KEY, FOREIGN KEY (contentID) REFERENCES contentHeader (contentID), ...) ENGINE=InnoDB;

4 つのクラスを作成しました。

@Entity
public class ContentHeader {

  @Id
  @GeneratedValue
  protected int contentID;

  ...
}

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class Content {

  @Id
  @OneToOne
  protected ContentHeader contentHeader;

  ...
}

@Entity
public class ContentType1 extends Content {
  ...
}

@Entity
public class ContentType2 extends Content {
  ...
}

これにより、スキーマを生成しようとすると null ポインターがスローされます。私は単純なものが欠けていると確信しています。PrimaryKeyJoinColumn に気付きましたが、それが必要かどうかはわかりません。

4

1 に答える 1

7

ContentHeader のみを持つ複合 ID クラスを作成できます。

@Embeddable
public class ContentKey implements java.io.Serializable {

    @ManyToOne(cascade = {}, fetch = FetchType.LAZY)
    @JoinColumn(name = "ID", updatable = true)
    private ContentHeader header;
    // ...
}

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class Content {

    @Id
    public ContentKey  getContentKeyId()
    // ...
}

これでうまくいくはずです。

于 2009-05-25T10:16:58.867 に答える