Использование сущности (и ее первичного ключа) в качестве идентификатора другой сущности - PullRequest
1 голос
/ 25 мая 2009

Итак, я не уверен, как задать этот вопрос, так как кажется, что найти ответ на этот вопрос должно быть довольно легко.

у меня 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, но я не уверен, что мне это нужно или нет.

1 Ответ

2 голосов
/ 25 мая 2009
You can create a composite id class that only have the ContentHeader:

@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()
    // ...
}

Это должно сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...