2
respostas

Meu programa não executa como o do instrutor

package br.com.caelum.financas.teste;

import java.util.List;

import javax.persistence.EntityManager; import javax.persistence.Query;

import br.com.caelum.financas.modelo.Categoria; import br.com.caelum.financas.modelo.Conta; import br.com.caelum.financas.modelo.Movimentacao; import br.com.caelum.financas.modelo.TipoMovimentacao; import br.com.caelum.financas.util.JPAUtil;

public class TestaMovimentacoesPorCategoria { public static void main(String[] args) {

    EntityManager em = new JPAUtil().getEntityManager();
    em.getTransaction().begin();

    Categoria categoria = new Categoria();
    categoria.setId(1);

    String jpql = "select m from Movimentacao m join m.categoria c where c = :pCategoria";

    Query query = em.createQuery(jpql);
    query.setParameter("pCategoria", categoria);

    List<Movimentacao> resultados = query.getResultList();

    for (Movimentacao movimentacao : resultados) {
        System.out.println("Descricao: " + movimentacao.getDescricao());
        System.out.println("Conta.id: " + movimentacao.getConta().getId());
    } 

    em.getTransaction().commit();
    em.close();
}
}
2 respostas

Exception in thread "main" java.lang.Error: Unresolved compilation problem: The constructor Categoria() is undefined

at br.com.caelum.financas.teste.TestaMovimentacoesPorCategoria.main(TestaMovimentacoesPorCategoria.java:20)

Olá Kelvis, tudo bem? Peço desculpas pela demora no retorno! Mesmo sem ver seu código completo, e principalmente dos modelos, penso que o problema é que na classe Categoria não tem um construtor padrão, que é chamado nessa linha:

Categoria categoria = new Categoria();

Então a solução é adicionar uma sobrecarga de construtor na sua classe Categoria da seguinte forma:

public Categoria() {
}

Pronto, dessa forma ele não deve mais retornar esse erro, e isso é apenas para fins de testes, na prática, seguindo a ideia do curso uma categoria sempre precisa ser inicializada com um nome ao menos, mas para facilitar os testes é interessante criar esse construtor padrão como visto acima e então inserir apenas o ID como já está no seu código, porém para evitar o uso desse construtor, ou pelo menos notificar ao pessoal da equipe de desenvolvedores que esse construtor padrão não deve ser utilizada em produção podemos inserir a anotação @Deprecated sobre o construtor padrão, ficando agora da seguinte forma:

@Deprecated
public Categoria() {
}

Espero ter ajudado e bons estudos!