Referência Circular

9 respostas
E

Bom dia,
Tenho uma classe que monta o organograma da empresa.
A classe organograma é composta pelos atributos id, nome e idPai.
Gostaria de criar um método onde eu passasse o idPai como parâmetro e me retornasse toda a hierarquia desse pai, ou seja, filhos, netos, bisnetos … Nnetos.

Obrigado.

9 Respostas

davidtiagoconceicao

Por favor seja mais específico na sua dúvida.

Você quer, à partir de um nó, retornar todos abaixo dele, é isso?
Como você quer fazer este retorno, em forma de um novo organograma?

Não sou um grande conhecedor de organogramas, mas acho que eles tem comportamento semelhantes à árvores, não tem?
Sugiro que você procure por algoritmos para impressão manipulação de árvores (da área de estruturas de dados).

peczenyj

Hum... id, nome e idPai é coisa de banco de dados. Vou ignorar isso por enquanto

Aparentemente vc tem (ou pode ter) algo como

class Pessoa {
 private long id;
 private String nome;
 private Pessoa pai; /* isso é java */
 /* construtor e métodos getters */
}

Agora, se vc quer toda uma hierarquia a partir de uma pessoa, ao meu ver vc teria que criar uma arvore usando algum algoritmo recursivo-descendente.

Se vc tiver uma lista de pessoas, vc pode usar o pseudoalgoritmo abaixo:

Pessoa principal = new Pessoa(parametros);
List<Pessoa> lista = QQcoisa.getListaPessoas();

List<Pessoa> listaDaquelaHierarquia = new ArrayList();
for(Pessoa pessoa : lista){
   if(pessoa.isFilho(principal)){
      listaDaquelaHierarquia.add(pessoa);
   }
}

Isso traria os filhos. Para isso isFilho(candidato) deve ser algo como

public boolean isFilho(Pessoa candidato){
    return this.pai != null && this.pai.equals(candidato); 
}

Para pegar toda a hierarquia vc pode fazer isso N vezes (recursivamente) ou vc pode apelar para estruturas de dados mais interessantes (como montar uma arvore baseado em quem é pai de quem e, então, pegar um ramo da arvore).

É claro que, se isso reflete o banco de dados e vc quer fazer isso via SQL ou Hibernate, vc tem varias opções para realizar o que vc quer. Por exemplo, no Oracle, vc tem a clausula "Connected By", para dados desse tipo (tipico de bancos hierarquicos).

Z111

mmm… many to many

class Pessoa {
    private int id;
    private String nome;
    private Pessoa superior;
    private Set&lt;Pessoa&gt; subordinados;
}

claro, seria bom um atributo para identificar a posição hierárquica da criatura.

Vai que tem um iluminado que tenta pendurar um gerente como subordinado de um peão.

fantomas

engfelipeoliveira:
Bom dia,
Tenho uma classe que monta o organograma da empresa.
A classe organograma é composta pelos atributos id, nome e idPai.
Gostaria de criar um método onde eu passasse o idPai como parâmetro e me retornasse toda a hierarquia desse pai, ou seja, filhos, netos, bisnetos … Nnetos.

  1. Esta estrutura de dados está mapeada em um ORM?

  2. Você está querendo saber “como seria se fosse”?

  3. A estrutura de dados já está montada aquequadamente, vc quer saber apenas como percorrer a alista?

flws

Fernando_Generoso_da

Com essa estrutura seria meio complicado achar todos os filhos de um mesmo pai…já que o nó só tem referência para o pai, e não tem referência para uma lista de filhos…Só consico percorrer das folhas para a raiz… Ou estou errado??

Fernando

L

Com a estrutura enviada pelo Z, consegue-se (através de subordinados):

class Pessoa {  
     private int id;  
     private String nome;  
     private Pessoa superior;  
     private Set<Pessoa> subordinados;  
}
E

OK pessoal.
Seguindo a linha do Oracle, montei a seguinte query:

SELECT x.lota_nm_lotacao FROM tb_lotacao x CONNECT BY PRIOR x.id_lotacao=x.id_unidade_pai START WITH x.id_unidade_pai = parametro ORDER SIBLINGS BY x.lota_nm_lotacao

Está me retornando exatemente o que eu quero.
A minha dúvida é, como transformar isso em uma query para o hibernate?

public List<LotacaoEntity> recuperaFilhos() throws Exception { try{ Session sess = PlcHibernateManagerLocator.getInstance().getHibernateManagerClasse("default").getSession(); return sess.createQuery(" from LotacaoEntity obj ") .list(); }catch (Exception e) { } }

fantomas

Acredito que ao mapear as entidades vc terá como resultado a lista com as associações corretas.

É claro que, se vc quiser incluir as informações desta entidades em algum objeto visual vc deverá fazer uma leitura recursiva na lista resultante.

flws

Z111

Aproveitando, como eu mapearia com o hibernate a classe Pessoa?

Criado 1 de abril de 2009
Ultima resposta 2 de abr. de 2009
Respostas 9
Participantes 7