将一个实体(及其主键)用作另一个实体的ID

问题描述 投票:2回答:1

所以,我不确定如何问这个问题,因为似乎很容易找到这个问题的答案。

我有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;

我创建了四个类:

@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 {
  ...
}

尝试生成模式时,这将引发空指针。我很确定我只是缺少一些简单的东西。我注意到PrimaryKeyJoinColumn,但是不确定是否是我需要的。

hibernate jpa annotations entity
1个回答
3
投票

您可以创建仅具有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()
    // ...
}

这应该可以解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.