Problema com tabela com chave composta [RESOLVIDO]

Bom dia,

estou com o seguinte problema:

Tenho uma tabela chamada de Funcionário que tem por uma chave composta formada por pessoaJuridica e pessoaFisica, porém quando inicio o projeto, é apresentado o seguinte erro:

org.hibernate.MappingException: Unable to find column with logical name: id in org.hibernate.mapping.Table(funcionarios) and its related supertables and secondary tables

O código fonte de cada uma destas classes é o seguinte:

@Entity
@Table(name = "funcionarios")
public class Funcionario implements Serializable {

    @EmbeddedId
    private IFuncionarioPK id = new IFuncionarioPK();
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "pessoaJuridica", referencedColumnName = "pessoa")
    private PessoaJuridica pessoaJuridica;
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "pessoaFisica", referencedColumnName = "pessoa")
    private PessoaFisica pessoaFisica;
    @Column(nullable=false)
    private String registro;
    @Column(nullable=false)
    private Integer dataBase;
    @Column(nullable=false)
    private Double salario;
    @Temporal(javax.persistence.TemporalType.DATE)
    @Column(nullable=true)
    private Date dataDaOpcaoFGTS;
    @Column(nullable=false)
    private String contaFGTS;
    @Column(nullable=false)
    private Boolean contribuicaoSindical;
    @Column(nullable=true)
    private Double ajudaDeCusto;
    @Column(nullable=true)
    private Integer percentagemDeAdiantamento;
    @Temporal(javax.persistence.TemporalType.DATE)
    @Column(nullable=false)
    private Date dataDeAdmissao;
    @Temporal(javax.persistence.TemporalType.DATE)
    @Column(nullable=true)
    private Date dataDeTransferencia;
    @Temporal(javax.persistence.TemporalType.DATE)
    @Column(nullable=true)
    private Date dataDoDesligamento;
    @Temporal(javax.persistence.TemporalType.DATE)
    @Column(nullable=true)
    private Date dataDePagamentoDaRecisao;
    @Column(nullable=true)
    private Boolean temAvisoPrevio;
    @Temporal(javax.persistence.TemporalType.DATE)
    @Column(nullable=true)
    private Date dataDoAvisoPrevio;
    @Column(nullable=true)
    private Integer numeroDeDiasDeAvisoPrevio;
    @OneToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "carteiraDeTrabalho", referencedColumnName = "id")
    private CarteiraDeTrabalho carteiraDeTrabalho;
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "funcao", referencedColumnName = "id")
    private Funcao funcao;
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "situacaoDeFuncionario", referencedColumnName = "id")
    private SituacaoDeFuncionario situacaoDeFuncionario;
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "situacaoDeFGTS", referencedColumnName = "id")
    private SituacaoDeFGTS situacaoDeFGTS;
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "tipoDeAdmissao", referencedColumnName = "id", nullable=false)
    private TipoDeAdmissao tipoDeAdmissao;
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "motivoDeAdmissao", referencedColumnName = "id", nullable=false)
    private MotivoDeAdmissao motivoDeAdmissao;
    //geter, seters, equals e hashcode
}
@Entity
@Table(name = "pessoasjuridicas")
@PrimaryKeyJoinColumn(name = "pessoa")
public class PessoaJuridica extends AbstractPessoa {

    @Column(nullable = false)
    private String nomeFantasia;
    @Column(nullable = false)
    private String cnpj;
    @OneToMany(mappedBy = "pessoaJuridica")
    private Set<Funcionario> funcionarios;
    //geter, seters, equals e hashcode
}
@Entity
@Table(name = "pessoasfisicas")
@PrimaryKeyJoinColumn(name = "pessoa")
public class PessoaFisica extends AbstractPessoa {

    private String sexo;
    private String estadoCivil;
    private String tipoSanguineo;
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "deficiencia", referencedColumnName = "id")
    private Deficiencia deficiencia;
    private String cpf;
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "naturalidade", referencedColumnName = "id")
    private Cidade naturalidade;
    @OneToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "certificadoDeReservista", referencedColumnName = "id")
    private CertificadoDeReservista certificadoDeReservista;
    @OneToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "tituloDeEleitor", referencedColumnName = "id")
    private TituloDeEleitor tituloDeEleitor;
    @OneToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "carteiraDeIdentidade", referencedColumnName = "id")
    private CarteiraDeIdentidade carteiraDeIdentidade;
    @OneToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "carteiraDeMotorista", referencedColumnName = "id")
    private CarteiraDeMotorista carteiraDeMotorista;
    //geter, seters, equals e hashcode
}

Toda ajuda é bem vinda.
Desde já agradeço a ajuda de todos.

jrfercar Boa Tarde!

Não sei se é a solução, mas até aonde eu entedi o erro é que tem um atributo que ele está tentando referenciar para dois objetos,

 @ManyToOne(fetch = FetchType.EAGER)   
    @JoinColumn(name = "pessoaJuridica", referencedColumnName = "pessoa")   
    private PessoaJuridica pessoaJuridica;   
    @ManyToOne(fetch = FetchType.EAGER)   
    @JoinColumn(name = "pessoaFisica", referencedColumnName = "pessoa")   
    private PessoaFisica pessoaFisica;   

Será que você nao pode passar no lugar dessas duas pessoas, uma pessoa genérica? (AbstractPessoa)

Galera, consegui resolver o problema.

Era o seguinte.

Na classe funcionário eu estava mapeando um atributo que fazia parte da classe pessoafisica.

O nome do atributo era carteiraDeTrabalho.

Fiz o mapeamento do atributo na classe certa e resolveu o problema.

Para ajudar quem tenha o mesmo problema, a classe funcionário ficou da seguinte forma:

@Entity
@Table(name = "funcionarios")
public class Funcionario implements Serializable {

    @EmbeddedId
    private IFuncionarioPK id = new IFuncionarioPK();
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "pessoaJuridica", referencedColumnName = "pessoa", insertable = false, updatable = false)
    private PessoaJuridica pessoaJuridica;
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "pessoaFisica", referencedColumnName = "pessoa", insertable = false, updatable = false)
    private PessoaFisica pessoaFisica;
    @Column(nullable = false)
    private String registro;
    @Column(nullable = false)
    private Integer dataBase;
    @Column(nullable = false)
    private Double salario;
    @Temporal(javax.persistence.TemporalType.DATE)
    @Column(nullable = true)
    private Date dataDaOpcaoFGTS;
    @Column(nullable = false)
    private String contaFGTS;
    @Column(nullable = false)
    private Boolean contribuicaoSindical;
    @Column(nullable = true)
    private Double ajudaDeCusto;
    @Column(nullable = true)
    private Integer percentagemDeAdiantamento;
    @Temporal(javax.persistence.TemporalType.DATE)
    @Column(nullable = false)
    private Date dataDeAdmissao;
    @Temporal(javax.persistence.TemporalType.DATE)
    @Column(nullable = true)
    private Date dataDeTransferencia;
    @Temporal(javax.persistence.TemporalType.DATE)
    @Column(nullable = true)
    private Date dataDoDesligamento;
    @Temporal(javax.persistence.TemporalType.DATE)
    @Column(nullable = true)
    private Date dataDePagamentoDaRecisao;
    @Column(nullable = true)
    private Boolean temAvisoPrevio;
    @Temporal(javax.persistence.TemporalType.DATE)
    @Column(nullable = true)
    private Date dataDoAvisoPrevio;
    @Column(nullable = true)
    private Integer numeroDeDiasDeAvisoPrevio;
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "funcao", referencedColumnName = "id")
    private Funcao funcao;
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "situacaoDeFuncionario", referencedColumnName = "id")
    private SituacaoDeFuncionario situacaoDeFuncionario;
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "situacaoDeFGTS", referencedColumnName = "id")
    private SituacaoDeFGTS situacaoDeFGTS;
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "tipoDeAdmissao", referencedColumnName = "id", nullable = false)
    private TipoDeAdmissao tipoDeAdmissao;
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "motivoDeAdmissao", referencedColumnName = "id", nullable = false)
    private MotivoDeAdmissao motivoDeAdmissao;
//geters, seters, equals e hashCode
}

Não esqueça de inserir o insertable = false, updatable = false nos atributos pessoaFisica e pessoaJuridica.