Mapeamento com herança

Gostaria de saber como implementar o seguinte caso no hibernate:
O código está extremamente reduzido…

// tabela
pessoa
 
funcionario
 id_pessoa


//classes
class Pessoa
{
  nome;
  end;
}

class Funcionario Extends Pessoa
{
  salario;
}

// consulta
Pessoa p = pessoa.consultar(1);
if (p instanceof Funcionario) {
  Funcionario f = (Funcionario) p;
  f.getSalario();
}

//cadastro
Funcionario f = new Funcionario();
Pessoa p = Pessoa.consultar(1);
f.associarAPessoa(p);
f.setSalario();
f.cadastrar()

Como mostrado ai em cima eu tenho uma classe Funcionario que extende a classe Pessoa.
Quando eu consultar Pessoa eu posso fazer casting para Funcionario se o mesmo estiver associado a Pessoa consultada.
Minha dúvida é também se esse arquitetura é a melhor…

Se isso é herança porque é que Pessoa se associa com Funcionário? Funcionário já não é uma pessoa não?

dificil opinar assim mas, pq não um factory que ja retorne a implementação correta, e vc trabalha com a interface publica(Pessoa) com a implementação que vc quer, no caso Funcionario.

<EDIT>
putz, não vi que era em relação ao mapeamento no Hibernate.
</EDIT>

[]'s

Os mapeamentos seriam:

<?xml version="1.0"?> <?xml version="1.0"?>

É verdade, mas a questão é que eu tenho um cadastro de pessoas, depois eu cadastro em Funcionario.
Uma Pessoa pode ser uma Funcionário, Terceiro, Estagiário, Visitante.

Referente ao mapeamento vou testar.
O problema é na hora de consultar pessoa. O hibernate vai saber que tem uma funcionário associado a ela ?

Claro que ele sabe :smiley:

http://www.hibernate.org/hib_docs/v3/reference/en/html/queryhql.html#queryhql-polymorphism

Se uma pessoa não pode se apenas Pessoa, então você coloca logo como uma das classes “filhas”, de preferência colocando pessoa como classe abstrata.