【问题标题】:Using an Entity (and their Primary Key) as another Entity's Id使用实体(及其主键)作为另一个实体的 ID
【发布时间】:2010-10-28 15:00:41
【问题描述】:

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

我有 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】:

    您可以创建一个只有 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()
        // ...
    }
    

    这应该可以解决问题。

    【讨论】:

      猜你喜欢
      • 2020-10-16
      • 1970-01-01
      • 2014-03-29
      • 2022-07-20
      • 1970-01-01
      • 2021-12-21
      • 2021-03-26
      • 2019-11-18
      • 1970-01-01
      相关资源
      最近更新 更多