Problemas com objetos agregados

7 respostas
R

Tenho um determinado método, que pega um ResultSet preenchido, e popula uma ArrayList com todos os resultados desse ResultSet.
Essa ArrayList só recebe um determinado objeto (Obra) que tem como agregados 2 outros objetos(RegiaoAdministrativa e Usuario).
Ele “seta” todas as variaveis nativas do objeto Obra normalmente, porém, ao “setar” os objetos agregados, eles são gravados um em
cima do outro.

Vejam o código:

private void construirLista() throws SQLException{
        while(rs.next()){
            Obra o = new Obra();
            o.setIdObra(rs.getInt("id_obra"));
            o.getRegiaoAdministrativa().setIdRegiaoAdministrativa(rs.getInt("id_regiao_administrativa"));
            o.setRegiaoAdministrativa(rafac.listarPorId(o.getRegiaoAdministrativa()));
            o.getUsuario().setIdUsuario(rs.getInt("id_usuario"));
            o.setUsuario(ufac.listarPorId(o.getUsuario()));
            o.setNumContrato(rs.getString("num_contrato"));
            o.setNumProcesso(rs.getString("num_processo"));
            o.setOrgaoResponsavel(rs.getString("orgao_responsavel"));
            o.setEmpresaContratada(rs.getString("empresa_contratada"));
            o.setObjetoContrato(rs.getString("objeto_contrato"));
            o.setEnderecoObra(rs.getString("endereco_obra"));
            o.setInicioContrato(f.formataDataView(rs.getString("inicio_contrato")));
            o.setFinalContrato(f.formataDataView(rs.getString("final_contrato")));
            o.setRepresentanteEmpresa(rs.getString("representante_empresa"));
            o.setRepresentanteOrgao(rs.getString("representante_orgao"));
            o.setNumDodf(rs.getInt("num_dodf"));
            o.setDiaDodf(rs.getInt("dia_dodf"));
            o.setPaginaDodf(rs.getInt("pagina_dodf"));
            listaObras.add(o);
            System.out.println(listaObras.get(0).getRegiaoAdministrativa().getNomeRegiaoAdministrativa());
        }
}

No console do TomCat, eu tenho o seguinte retorno dos prints executados logo após o “add” à lista:

Sobradinho Nucleo Bandeirante Lago Sul Brasilia Sao Sebastiao Candangolandia

Como podem ver, eu pedi para ser gerado em console sempre o nome da Regiao Administrativa do primeiro indice da lista, mas à cada loop,
esse valor muda, ele é gravado um em cima do outro.

Alguém poderia me dar uma luz?

7 Respostas

renanreismartins

opa, isso aqui tá mto estranho

o.getRegiaoAdministrativa().setIdRegiaoAdministrativa(rs.getInt("id_regiao_administrativa"));  

o.setRegiaoAdministrativa(rafac.listarPorId(o.getRegiaoAdministrativa()));

isso: rafac.listarPorId(o.getRegiaoAdministrativa()) tá retornando a reg certa?

abrassss

R

Então, esse método listarPorId(RegiaoAdministrativa regiaoAdministrativa), ele retorna um objeto RegiaoAdministrativa.
Dentro desse metodo, ele pega esse objeto, usa o getter para pegar o Id da regiaoAdministrativa, e faz uma pesquisa no banco
para saber o nome dessa região. E ele retorna tudo certinho sim, tanto é que se eu der um print nesse cara antes de adicionar à lista,
o valor vem certinho. O problema ocorre depois que eu adiciono à lista.

R

Pra tentar ficar um pouco mais claro e menos bagunçado, eu tentei fazer isso:

private void construirLista() throws SQLException{ while(rs.next()){ Obra o = new Obra(); RegiaoAdministrativa ra = new RegiaoAdministrativa(); Usuario usu = new Usuario(); o.setIdObra(rs.getInt("id_obra")); o.getRegiaoAdministrativa().setIdRegiaoAdministrativa(rs.getInt("id_regiao_administrativa")); ra = rafac.listarPorId(o.getRegiaoAdministrativa()); o.setRegiaoAdministrativa(ra); //o.setRegiaoAdministrativa(rafac.listarPorId(o.getRegiaoAdministrativa())); o.getUsuario().setIdUsuario(rs.getInt("id_usuario")); usu = ufac.listarPorId(o.getUsuario()); o.setUsuario(usu); //o.setUsuario(ufac.listarPorId(o.getUsuario())); o.setNumContrato(rs.getString("num_contrato")); o.setNumProcesso(rs.getString("num_processo")); o.setOrgaoResponsavel(rs.getString("orgao_responsavel")); o.setEmpresaContratada(rs.getString("empresa_contratada")); o.setObjetoContrato(rs.getString("objeto_contrato")); o.setEnderecoObra(rs.getString("endereco_obra")); o.setInicioContrato(f.formataDataView(rs.getString("inicio_contrato"))); o.setFinalContrato(f.formataDataView(rs.getString("final_contrato"))); o.setRepresentanteEmpresa(rs.getString("representante_empresa")); o.setRepresentanteOrgao(rs.getString("representante_orgao")); o.setNumDodf(rs.getInt("num_dodf")); o.setDiaDodf(rs.getInt("dia_dodf")); o.setPaginaDodf(rs.getInt("pagina_dodf")); listaObras.add(o); System.out.println(listaObras.get(0).getRegiaoAdministrativa().getNomeRegiaoAdministrativa()); System.out.println(listaObras.get(0).getOrgaoResponsavel()); } }

Mas não surtiu efeito.

renanreismartins

pro seu codigo ficar mais bonito vc pode fazer algo tipo

ra = afac.listarPorId(rs.getInt("id_regiao_administrativa"));  
o.setRegiaoAdministrativa(ra);

mas enfim, ta mto estranho sinceramente ainda nao achei o problema.

o metodo que chama esse construirLista nao altera a listaObras ?

posta td ai

abrassss

Rodrigo_Sasaki

onde você está instanciando sua listaObras?

R

Ok, vou dar um exemplo mais substancial:

Tenho uma outra classe, a classe de Usuarios. Essa classe também tem um objeto agregado (Perfil), e eu construo uma
lista dela exatamente da mesma forma que construo a lista de obras, porém, os resultados são diferentes, vejam:

public class UsuarioFactory{
    UsuarioDAO udao = new UsuarioDAO();
    Usuario usuario = new Usuario();
    PerfilFactory pfac = new PerfilFactory();
    List<Usuario> listaUsuarios = new ArrayList();
    ResultSet rs = null;

    private void construirLista() throws SQLException{
        while(rs.next()){
            Usuario usu = new Usuario();
            usu.setIdUsuario(rs.getInt("id_usuario"));
            usu.getPerfil().setIdPerfil(rs.getInt("id_perfil")); //Vejam que o processo de set do objeto agregado Perfil, é o mesmo processo do objeto RegiaoAdministrativa
            usu.setPerfil(pfac.listarPorId(usu.getPerfil()));   //na classe ObraFactory.
            usu.setNomeUsuario(rs.getString("nome_usuario"));
            usu.setLoginUsuario(rs.getString("login_usuario"));
            usu.setSenhaUsuario(rs.getString("senha_usuario"));
            listaUsuarios.add(usu);
	    System.out.print(listaUsuarios.get(0).getPerfil().getNomePerfil());
        }
    }
}

O retorno que tenho do System.out.println() nesse caso acima, é o seguinte:
teste
teste
teste
teste

Já na minha classe ObraFactory, a coisa é diferente:

public class ObraFactory{
    ObraDAO odao = new ObraDAO();
    Obra obra = new Obra();
    UsuarioFactory ufac = new UsuarioFactory();
    RAFactory rafac = new RAFactory();
    FormatFactory f = new FormatFactory();
    List<Obra> listaObras = new ArrayList();
    ResultSet rs = null;

    private void construirLista() throws SQLException{
        while(rs.next()){
            Obra ob = new Obra();
            ob.setIdObra(rs.getInt("id_obra"));
            ob.getRegiaoAdministrativa().setIdRegiaoAdministrativa(rs.getInt("id_regiao_administrativa"));
            ob.setRegiaoAdministrativa(rafac.listarPorId(ob.getRegiaoAdministrativa()));
            //ob.getUsuario().setIdUsuario(rs.getInt("id_usuario"));
            //ob.setUsuario(ufac.listarPorId(ob.getUsuario()));
            ob.setNumContrato(rs.getString("num_contrato"));
            ob.setNumProcesso(rs.getString("num_processo"));
            ob.setOrgaoResponsavel(rs.getString("orgao_responsavel"));
            //ob.setEmpresaContratada(rs.getString("empresa_contratada"));
            //ob.setObjetoContrato(rs.getString("objeto_contrato"));
            //ob.setEnderecoObra(rs.getString("endereco_obra"));
            //ob.setInicioContrato(f.formataDataView(rs.getString("inicio_contrato")));
            //ob.setFinalContrato(f.formataDataView(rs.getString("final_contrato")));
            //ob.setRepresentanteEmpresa(rs.getString("representante_empresa"));
            //ob.setRepresentanteOrgao(rs.getString("representante_orgao"));
            //ob.setNumDodf(rs.getInt("num_dodf"));
            //ob.setDiaDodf(rs.getInt("dia_dodf"));
            //ob.setPaginaDodf(rs.getInt("pagina_dodf"));
            listaObras.add(ob);
	    System.out.println(listaObras.get(0).getRegiaoAdministrativa.getNomeRegiaoAdministrativa());
        }
    }
}

Podem ver que o procedimento é exatamente o mesmo, porém, o retorno que tenho do System.out.println() é:
Sobradinho
Nucleo Bandeirante
Lago Sul
Brasilia
Sao Sebastiao
Candangolandia

Sendo que, como eu pego sempre o primeiro índice da array, ele não deveria fazer print de valores diferentes.

Espero que possam me ajudar. =S

pmlm

Mostra a class Obra

Criado 7 de novembro de 2011
Ultima resposta 8 de nov. de 2011
Respostas 7
Participantes 4