Ajuda com persistencia de herança no hibernate

Alguem poderia mim ajudar a implementar o metodo salvarAluno da classe AlunoController ou vê o que esta faltando.
E como eu faço nesse caso para criar um metodo na classe AlunoController par pegar os dados do bd e colocar numa pagina como tabela(pois são dados de tres tabelas pessoa, aluno e endereco)?

Obs. Esse modelo e do tutorial hibernate 3 que tem no site, eu estou usando tipo de mapeamento de tabela por Sub-Classe. E quando eu executo o codigo da um error.
Classe AlunoController:

[code]public class AlunoController {
private AlunoDao alunoDao = DaoFactory.getAlunoDao();
private DataModel model;
private Aluno aluno;
private Endereco endereco;

public String novoAluno() {
	aluno = new Aluno();
            endereco = new endereco();
	return "nvAluno";
}

public String salvarAluno() {
	try {
		if (alunoDao.recuperar(aluno.getId()) == null) {
		       aluno.setEndereco(endereco); 
                           alunoDao.salvar(aluno);
		} else
			alunoDao.atualizar(aluno);

		return "slAluno";
	} catch (Exception e) {
		e.printStackTrace();
		return "fcAluno";
	}

}


[/code]
Classe Pessoa:

[code]public class Pessoa implements Serializable{

private int id;
private String nome;
private String email;
private String telefone;
private Endereco endereco;


get e set
}[/code]

Classe Endereço:

[code]public class Endereco implements Serializable{

private int id;
private String rua;
private int numero;
private String bairro;
private String cidade;
private String estado;
private String complemento;
private String cep;
private Pessoa pessoa;


get e set
}[/code]

Classe Aluno:

public class Aluno extends Pessoa implements Serializable{ private String matricula; private Collection turmas; ... get e set }
Pessoa.hmb.xml: <hibernate-mapping package="model"> <class name="Pessoa" table="pessoa"> <id name="id" column="id"> <generator class="native"> <param name="sequence">seq_pessoa</param> </generator> </id> <property name="nome"></property> <property name="email"></property> <property name="telefone"></property> <one-to-one name="endereco" class="Endereco" cascade="save-update"></one-to-one> </class> </hibernate-mapping>
Aluno.hbm.xml:

<hibernate-mapping package="model"> <joined-subclass name="Aluno" extends="Pessoa" table="aluno"> <key column="pessoa_id" /> <property name="matricula" /> <set name="turmas" table="turma_has_aluno" inverse="false"> <key column="aluno_pessoas_id" /> <many-to-many class="Turma" column="turma_id" /> </set> </joined-subclass> </hibernate-mapping>
classe AlunoDao:

[code]public class AlunoDao extends AbstractDao<Aluno, Integer> {
private static AlunoDao instancia = null;

private AlunoDao(){
	super(Aluno.class);
}
protected static AlunoDao getInstancia(){
	if(instancia == null)
		instancia = new AlunoDao();
	return instancia;
}

}[/code]
classe AbstractDao:

[code]public abstract class AbstractDao<Tipo, TipoID extends Serializable> implements InterfaceDao<Tipo, TipoID>{
protected Session session;
protected Transaction tx;
protected Class classe;

protected AbstractDao(Class classe){
	this.classe = classe;
}
@Override
public void atualizar(Tipo obj) throws Exception {
	...
}
@Override
public void excluir(Tipo obj) throws Exception {
	...
}
@Override
public List<Tipo> listarTodos() throws Exception {
	...
}
@Override
public Tipo recuperar(TipoID id) throws Exception {
	....
}
@Override
public void salvar(Tipo obj) throws Exception {
	...
}

}[/code]
pagina novoAluno:

<f:view> <h2>Preenchar os Campos:</h2> <h:form> <h:panelGrid columns="2" border="0"> <h:outputText value="Matricula"/> <h:inputText id="matricula" value="#{aluCont.aluno.matricula}"/> <h:outputText value="Nome:" /> <h:inputText id="nome" value="#{aluCont.aluno.nome}" size="30" /> <h:outputText value="E-Mail:" /> <h:inputText id="email" value="#{aluCont.aluno.email}" size="30" /> <h:outputText value="Telefone:" /> <h:inputText id="telefone" value="#{aluCont.aluno.telefone}" size="11" /> <h:outputText value="Rua:" /> <h:inputText id="rua" value="#{aluCont.endereco.rua}" size="25" /> <h:outputText value="Numero:" /> <h:inputText id="numero" value="#{aluCont.endereco.numero}" size="3"/> <h:outputText value="Bairro:" /> <h:inputText id="bairro" value="#{aluCont.endereco.bairro}" size="15" /> <h:outputText value="Cidade:" /> <h:inputText id="cidade" value="#{aluCont.endereco.cidade}" size="15" /> <h:outputText value="Estado:" /> <h:inputText id="estado" value="#{aluCont.endereco.estado}" size="15" /> <h:outputText value="Complemento:" /> <h:inputText id="complemento" value="#{aluCont.endereco.complemento}" size="25" /> <h:outputText value="Cep:" /> <h:inputText id="cep" value="#{aluCont.endereco.cep}" /> </h:panelGrid> <h:commandButton value="Limpar" type="reset" /> <h:commandButton value="Gravar" action="#{aluCont.salvarAluno}" /> </h:form> </f:view>

error que aparece no console do eclipse:

Pessoal, já conseguiu resolver o problema é que as associações em java não são bidirecionais. Então método salvaAluno fica assim:

[code]public String salvarAluno() {
try {
if (alunoDao.recuperar(aluno.getId()) == null) {
aluno.setEndereco(endereco);
endereco.setPessoa(aluno);
alunoDao.salvar(aluno);
} else
alunoDao.atualizar(aluno);

		return "slAluno";
	} catch (Exception e) {
		e.printStackTrace();
		return "fcAluno";
	}
}

}[/code]

Error no meu codigo era que o hibernate indicava que o relacionamento entre aluno(onde aluno é uma pessoa) e endereço era nulo.