Erro de mapeamento - TOP LINK(Resolvido)

8 respostas
F

Classe Projeto que possui um atributo area:

@JoinColumn(name = "id_area", referencedColumnName = "id_area")
    @ManyToOne
    private Area area;

Classe Area:

public class Area implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "id_area", nullable = false)
    private Integer idArea;
   
    @Column(name = "DS_SIGLA", nullable = false)
    private String sigla;

    @Column(name = "DS_NOME", nullable = false)
    private String descricao;

    @Column(name = "DS_RESPONSAVEL")
    private String responsavel;   
   
    @Column(name = "FL_ATIVO", nullable = false)
    private Integer status;

    @Column(name = "DT_INCLUSAO", nullable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private Date dtInclusao;
   
    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "AREA_USUARIO",
                joinColumns = {@JoinColumn(name="id_area")},
                inverseJoinColumns = {@JoinColumn(name="id_usuario")}
                )
    private List<Usuario> usuarioList;

O método que faz a pesquisa:

public Servico findServicoByNumero(int numero, Usuario user, Boolean checkArea){       
        Servico serv = null;
        Servico serv2 = null;
        boolean check = true;
        try {
            EntityManager em = getEntityManager();
            javax.persistence.Query query = em.createNamedQuery("Servico.findByNumero");
            query.setParameter("numero", numero);
           
            serv = (Servico) query.getSingleResult();
           
            em.clear();
            } catch(NoResultException nre){
            throw new RegistroNaoEncontradoDaoExeption(" Nenhum registro encontrado", nre);
        } catch(Exception e){
            throw new DaoException("Erro ao executar Servico.findServicoByNumero", e);
        } finally {
           getEntityManager().close();
        }
       
        if(check == false){
            return null;
        }
        return serv;
    }
Na primeira vez ele faz a consulta e mapeia todos os objetos:
SELECT id_servico, dt_fim, observacao, numero, bl_bloqueiaaposfim, horas, descricao, dt_inicio, id_projeto, id_tiposervico, id_status FROM servico WHERE (numero = ?)

SELECT id_projeto, nome, id_area, id_equipe, id_liderprojeto FROM projeto WHERE (id_projeto = ?)

SELECT t1.id_usuario, t1.grupoldap, t1.bl_bloqueado, t1.nomesimples, t1.bl_horasrestritas, t1.matricula, t1.bl_liberadohoraextra, t1.bl_ativo, t1.mes_consolidado_adm, t1.dt_nascimento, t1.mes_consolidado_user, t1.nome, t1.senha, t1.dt_inicio, t1.username, t1.telefone, t1.dt_ultimoacesso, t1.id_empresa, t1.id_grupo, t1.id_area FROM participaprojeto t0, usuario t1 WHERE ((t0.id_projeto = ?) AND (t1.id_usuario = t0.id_usuario))

SELECT id_item, descricao, id_atividade, id_servico FROM item WHERE (id_servico = ?)

SELECT id_servico, dt_fim, observacao, numero, bl_bloqueiaaposfim, horas, descricao, dt_inicio, id_projeto, id_tiposervico, id_status FROM servico WHERE (numero = ?)

    Ao efetuar outra consulta ele não percorre a tabela projetos (ponto crucial para a funcionalidade):

SELECT id_servico, dt_fim, observacao, numero, bl_bloqueiaaposfim, horas, descricao, dt_inicio, id_projeto, id_tiposervico, id_status FROM servico WHERE (numero = ?)

8 Respostas

Paulo_Silveira

Oi Fox

De mais alguns detalhes pra gente:

  • Poste o metodo getEntityManager();
  • Qual é o problema exato? Quando voce da F5 na pagina, mesmo depois de atualizado os dados em outra, o relacionamento continua o mesmo?
  • Manda o codigo pra gente do outro codigo que atualiza o relacionamento Projeto/Area
F

Opa

Acabei de colocar o método que efetua a pesquisa:

public Servico findServicoByNumero(int numero, Usuario user, Boolean checkArea){         
        Servico serv = null;          
        boolean check = true;  
        try {  
            EntityManager em = getEntityManager();  
            javax.persistence.Query query = em.createNamedQuery("Servico.findByNumero");  
            query.setParameter("numero", numero);  
             
            serv = (Servico) query.getSingleResult();  
             
            } catch(NoResultException nre){  
            throw new RegistroNaoEncontradoDaoExeption(" Nenhum registro encontrado", nre);  
        } catch(Exception e){  
            throw new DaoException("Erro ao executar Servico.findServicoByNumero", e);  
        } finally {  
           getEntityManager().close();  
        }  
         
        if(check == false){  
            return null;  
        }  
        return serv;  
    }
protected EntityManager getEntityManager() {
        if (managerThread.get() == null || !managerThread.get().isOpen()) {
            EntityManager ema = emf.createEntityManager();  
            managerThread.set(ema);              
        }
        return managerThread.get();  
    }
Paulo_Silveira

e quem chama projeto.setArea()

e Area tem relacao pra projeto?

F

A relação está com o Projeto:

Classe Projeto que possui um atributo area:

@JoinColumn(name = "id_area", referencedColumnName = "id_area")
    @ManyToOne
    private Area area;
Paulo_Silveira

Se nao ha o mapeamento bidirecional, tudo parece seguro. Mas mostre onde voce invoca o projeto.setArea(area) e faz o merge do objeto por favor.

F

Opa, em primeiro lugar obrigadão pela ajuda Paulo.

Na realidade eu não faço o setArea, quando eu chamo a consulta:

@NamedQuery(name = "Servico.findByNumero", query = "SELECT s FROM Servico s WHERE s.numero = :numero"),

no método:

public Servico findServicoByNumero(int numero, Usuario user, Boolean checkArea){        
        Servico serv = null;
        
        boolean check = true;
        try {
            EntityManager em = getEntityManager();
            javax.persistence.Query query = em.createNamedQuery("Servico.findByNumero");
            query.setParameter("numero", numero);
            
            serv = (Servico) query.getSingleResult();
         } catch(NoResultException nre){
            throw new RegistroNaoEncontradoDaoExeption(" Nenhum registro encontrado", nre);
        } catch(Exception e){
            throw new DaoException("Erro ao executar Servico.findServicoByNumero", e);
        } finally {
           getEntityManager().close();
        }
        
        if(check == false){
            return null;
        }
        return serv;
    }

Ele faz o mapeamento, na primeira consulta ocorre tudo bem, mas quando os valores são alterados não é feito o mapeamento novamente. Tentei até fazer a consulta forçando o join:

@NamedQuery(name = "Servico.findByNumero", query = "SELECT s FROM Servico s join s.idProjeto p join p.area a WHERE s.numero = :numero"),

Mas também não obtive resultados, o que poderia ser?

Paulo_Silveira

quando voce fala “depois que a gente atualiza os dados”, como voce esta os atualizando?

F

Bom-dia Paulo,

O problema estava exatamente onde vc apontou, estava fazendo update por fora utilizando o pgadmin.
O servidor não estava conseguindo sincronizar esses dados.
Paulo, agradeço muito a sua prestação e colaboração.
Marcus, agradeço pelo apoio.

Após muita luta, consegui resolver.

Criado 15 de junho de 2011
Ultima resposta 28 de jun. de 2011
Respostas 8
Participantes 2