Usando uma entidade (e sua chave primária) como Id de outra entidade
-
05-09-2019 - |
Pergunta
Então, eu não tenho certeza de como fazer esta pergunta, pois parece que deve ser muito fácil de encontrar a resposta a esta.
Eu tenho 3 tabelas; ContentHeader, ContentType1 e ContentType2. ContentHeader tem uma chave primária, auto-incremento. ContentType1 e ContentType2 tanto manter chaves estrangeiras a chave primária da ContentHeader. Estas chaves estrangeiras também são as principais chaves para suas respectivas tabelas.
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;
Eu criei quatro 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 {
...
}
Isso gera um ponteiro nulo ao tentar gerar o esquema. Eu tenho certeza que eu estou faltando algo simples. Notei o PrimaryKeyJoinColumn, mas não tenho certeza se é o que eu preciso ou não.
Solução
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()
// ...
}
Isso deve fazer o truque.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow