Question

Alors, je ne sais pas comment poser cette question, car il semble que ce devrait être assez facile de trouver la réponse à celle-ci.

J'ai 3 tables; ContentHeader, ContentType1 et ContentType2. ContentHeader a une clé primaire, incrémentation automatique. à la fois ContentType1 et ContentType2 maintenir les clés étrangères à la clé primaire de ContentHeader. Ces clés étrangères sont aussi les clés primaires pour leurs tables respectives.

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;

J'ai créé quatre classes:

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

Cela jette un pointeur NULL lorsque vous essayez de générer le schéma. Je suis sûr que je suis manque juste quelque chose de simple. J'ai remarqué la PrimaryKeyJoinColumn, mais je ne suis pas sûr que ce soit ce que je dois ou non.

Était-ce utile?

La solution

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

Cela devrait faire l'affaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top