Relacionamento recursivo no Hibernate

Estou usando o Hibernate num pequeno projeto e já fiz alguns relacionamentos, one-to-many e many-to-one com algumas tabelas.
Mas tem uma tabela que tem um relacionamento recursivo que não consegui fazer funcionar ainda.

Exemplo do caso que estou com problema:
Tabela Pessoa
Codigo int(11)
Nome varchar(40)
Codigo_pai int(11)

Codigo: 1, Nome: Fulano de Tal, Codigo_pai: 0
Codigo: 2, Nome: José da Silva, Codigo_pai: 1

São 2 problemas que preciso resolver:

  1. como fazer esse relacionamento no hibernate
  2. como permitir que em alguns casos ele aceite que não existe um codigo_pai

Se alguém puder ajudar, agradeço muito, pois já pesquisei em vários lugares e tentei de várias maneiras e não deu certo.

basta fazer um many-to-one para a própria classe.

Foi exatamente o que fiz e não deu certo !!! :frowning:

Mas deu algum erro???

Um problema q tive foi quando, por exemplo o auto-relacionamento era com o próprio objeto (a base de dados q estou trabalhando é de um sistema legado e nesse sistema esse tipo de coisa podia acontecer)…

Não sei se existe uma maneira de contornar esse problema!!

Erro não mas não funciona como esperado.
Acontecem 2 coisas erradas:
Primeiro, não aceita que algum registro tenha o campo codigo_pai sem um correspondente, ou seja, com valor=0.
Segundo, ao invés de trazer o registro correspondente, traz o mesmo, como se o codigo_pai estivesse indicando o próprio registro!

Eis o mapeamento desta classe para vocês me entenderem melhor:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> <hibernate-mapping> <class name="br.com.assist.modelo.gestao.Pessoa" table="pessoa"> <id name="codigoPessoa" column="CODIGO_PESSOA" type="long"> <generator class="native"/> </id> <property name="nome" column="NOME" type="string" length="10"/> <many-to-one name="pessoaPai" class="br.com.assist.modelo.gestao.Pessoa" column="CODIGO_PESSOA" insert="false" update="false"/> <set name="pessoaFilho" cascade="all" inverse="true" lazy="true"> <key column="CODIGO_PESSOA_PAI"/> <one-to-many class="br.com.assist.modelo.gestao.Pessoa"/> </set> </class> </hibernate-mapping>

pessoaPai teria que me retorna o registro correspondente ao pai e pessoaFilho foi colocado para fazer o inverso, ou seja, trazer todos que tiverem um mesmo pai.

Ana vc ta com o mapping errado, comparei com um caso onde tive o mesmo problema e creio que o correto seja:

<many-to-one name="pessoaPai" class="br.com.assist.modelo.gestao.Pessoa" column="CODIGO_PESSOA_PAI" insert="false" update="false"/>

<set name="pessoaFilho" cascade="all" inverse="true" lazy="true">
    <key column="CODIGO_PESSOA_PAI"/>
    <one-to-many class="br.com.assist.modelo.gestao.Pessoa"/>
</set>

Note que a diferença esta em many-to-one -> column

Valeu, louds, obrigada, agora está trazendo o pai correspondente!!!

Só que no caso de eu não ter um pai, ou seja, codigo_pessoa_pai = 0, está dando exception… tem como resolver isso também?
Senão vai ficar um relacionamento infinito, concorda?

[quote=“ana_abrantes”]Valeu, louds, obrigada, agora está trazendo o pai correspondente!!!

Só que no caso de eu não ter um pai, ou seja, codigo_pessoa_pai = 0, está dando exception… tem como resolver isso também?
Senão vai ficar um relacionamento infinito, concorda?[/quote]

porque fica codigo_pessoa_pai = 0? deveria ficar “null”. Então o objeto pessoaPai simplesmente estará null se não existir pai.

Se eu deixar o atributo pessoaPai (que é da classe Pessoa) com ‘null’, dá NullPointerException na hora que eu mando executar o método ‘save’ em Pessoa… :frowning:

impossível :slight_smile:

Se vc fizer assim, da NullPointer ? Veja a linha do NullPointer, pode ser em outro lugar, manda o stackTrace :slight_smile:

Pessoa p = new ....
p.setNome(....

session.save();

Foi exatamente na linha do save…

PessoaDAO pDAO = new PessoaDAO(); Pessoa pessoa = new Pessoa(); pessoa.setCodigo( ... pessoa.setNome( ... String codigoPai = req.getParameter("PESSOA_PAI"); Pessoa pessoaPai = null; if(!codigoPai.equals("0")){ pessoaPai = (Pessoa)pDAO.getByPrimaryKey(codigoPai); } pessoa.setPessoaPai(pessoaPai); pDAO.save(pessoa);

Está mais ou menos assim, é que eu não estou com o código aqui agora…
Só à noite que vou poder mexer nele de novo.

O campo PESSOA_PAI do form é um select com todas as pessoas e eu acrescentei uma com o código 0 e descrição em branco para este caso de não ter o pai.

Verifiquei e é isto mesmo que eu tinha postado anteriormente.

Sei lá, acho que se eu tiver que criar uma pessoa com código zero é estranho demais! :shock:

Tem mais alguma sugestão para me dar, Ricardo… louds… ?

troca o tipo no objeto para Integer em vez de int que funciona direitinho, ai quando não tiver nada associado fica como null, que representa exatamente isto.

PS.: desculpe se ja sugeriram isto, mas realmente não li todas as mensagens da thread.

estou com o mesmo problema da ana…
alguém poderia dar umas dicas…urgente…