[RESOLVIDO] Herança entre tabelas/classes - "Unable to find column with logical name"

4 respostas
Nicolas_Fernandes

E aí, galerinha do GUJ. Tudo bem com vocês?

Vejam só: Eu tenho uma tabela "Pessoas", uma tabela "Funcionarios" e uma tabela "Empresas". Ambas tabelas "Funcionarios" e "Empresas" possuem, como chave primária, uma coluna que é chave estrangeira de "Pessoas".
CREATE TABLE dbo.PESSOAS (
ID BIGINT NOT NULL PRIMARY KEY,
NOME VARCHAR(100));

CREATE TABLE dbo.FUNCIONARIOS (
PESSOA BIGINT NOT NULL PRIMARY KEY,
FOREIGN KEY (PESSOA) REFERENCES dbo.PESSOAS(ID),
CRACHA VARCHAR(20));

CREATE TABLE dbo.EMPRESAS (
PESSOA BIGINT NOT NULL PRIMARY KEY,
FOREIGN KEY (PESSOA) REFERENCES dbo.PESSOAS(ID),
NOMEFANTASIA VARCHAR(50));
As classes estão mapeadas assim:
@Entity
@DiscriminatorValue("pessoa")
@Table(schema="dbo", name="PESSOAS")
@Inheritance(strategy=InheritanceType.JOINED)
@SequenceGenerator(sequenceName="dbo.SEQ_PESSOAS", name="s")
public abstract class Pessoa implements Serializable {

    @Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="s")
    private long pessoaID;

    @Column(name="NOME", nullable=false)
    private String nome;
}

@Entity
@Table(schema="dbo", name="FUNCIONARIOS")
@PrimaryKeyJoinColumn(name="pessoaID")
public class Funcionario extends Pessoa {
    private String cracha;
}

@Entity
@Table(schema="dbo", name="EMPRESAS")
@PrimaryKeyJoinColumn(name="pessoaID")
public class Empresa extends Pessoa {
    private String nomeFantasia;
}
E me retorna o seguinte erro:
org.hibernate.MappingException: Unable to find column with logical name: ID in org.hibernate.mapping.Table(dbo.PESSOAS) and its related supertables and secondary tables

Não consigo compreendê-lo bem, vocês podem me dar uma ajuda sobre o problema?
Valeu, galera,
fiquem com Deus! :D

4 Respostas

Rodrigo_Sasaki

Tente anotar seu atributo pessoaID com @Column, setando o nome da coluna na tabela.

Nicolas_Fernandes

Opa, Rodrigo Sasaki, obrigado pela resposta. Funcionou. Mas não entendi a necessidade de tal. Saberia me explicar o porquê disso?

Rodrigo_Sasaki

Sem problemas, é que se você não definir o nome da coluna, ele usará o nome do atributo, e como você não tem uma coluna pessoaID na sua tabela, ele não encontrou o que queria.

Nicolas_Fernandes

Sem problemas, é que se você não definir o nome da coluna, ele usará o nome do atributo, e como você não tem uma coluna pessoaID na sua tabela, ele não encontrou o que queria.
É, faz sentido. Bobeira minha, haha. Obrigado, cara, fique com Deus! :smiley:

Criado 22 de outubro de 2012
Ultima resposta 22 de out. de 2012
Respostas 4
Participantes 2