Aplicação web com Hibernate e JSF: Unable to find component with ID in view

Pessoal, estou com um problema para persistir dados de uma tela de cadastro que não estou conseguindo identificar o motivo.

Seguinte: tenho uma tela de compras de produtos, coisa simples, contendo a data da compra, o produto (que é selectMenu onde posso selecionar o produto provindo do BD) e a quantidade comprada.

O que ocorre é que ao tentar persistir esses dados ocorre a seguinte Warning, porém apesar de ser uma Warning não salva nenhuma informação no banco:

WARNING: Unable to find component with ID produto in view.

Segue o trecho do código onde tento salvar os dados, que é o ManagedBean que comunica-se com a pagina xhtml:

[code] public void salvar(){
//System.out.println(“Gravando informações da compra”);
Produto produto = new DAO(Produto.class).buscar(this.idProduto);

	this.compra.setProduto(produto);
	System.out.println("Id produto " + produto.getDsProduto());
	new DAO<Compra>(Compra.class).salvar(this.compra);
	
	this.compra = new Compra();
}[/code]

Esse trecho: System.out.println("Id produto " + produto.getDsProduto()); retorna a descrição correta do produto, o que diz que a busca está sendo realizada.

Classe compra:

@Entity
public class Compra {
	
	@Id @GeneratedValue
	private long idCompra;
	private String dataCompra;
	
	@ManyToOne
	private Produto produto;
	private int qtde;
	
	public String getDataCompra() {
		return dataCompra;
	}
	public void setDataCompra(String dataCompra) {
		this.dataCompra = dataCompra;
	}
	public Produto getProduto() {
		return produto;
	}
	public void setProduto(Produto produto) {
		this.produto = produto;
	}
	public int getQtde() {
		return qtde;
	}
	public void setQtde(int qtde) {
		this.qtde = qtde;
	}

	
	
}

Classe Produto

@Entity
public class Produto {
	@Id
	@Column(name="id")
	private int id;
	@Column(name="dsproduto")
	private String dsProduto;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getDsProduto() {
		return dsProduto;
	}
	public void setDsProduto(String dsProduto) {
		this.dsProduto = dsProduto;
	}
	
	
}

Alguém saberia me dizer o que está ocorrendo?

Obrigado.

Talvez esse warning não tenha nada a ver mesmo com o fato de não estar salvando. Habilita o log do hibernate para aparecer as instruções SQL no console, e você ver se pelo menos o insert está sendo gerado. As vezes é falta de commit/flush.

Posta o código do DAO.

Verifiquei o log gerado e a instrução de insert realmente ocorre, porém não persiste no banco.

Estou enviando o DAO então, para facilitar a compreensao:

public class DAO<T> {

	private final Class<T> classe;

	public DAO(Class<T> classe) {
		this.classe = classe;
	}

	public void salvar(T t) {

		// consegue a entity manager
		EntityManager em = new JPAUtil().getEntityManager();

		// abre transacao
		em.getTransaction().begin();

		// persiste o objeto
		em.persist(t);

		// commita a transacao
		em.getTransaction().commit();

		// fecha a entity manager
		em.close();
	}

	public void excluir(T t) {
		EntityManager em = new JPAUtil().getEntityManager();
		em.getTransaction().begin();

		em.remove(em.merge(t));

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

	public void alterar(T t) {
		EntityManager em = new JPAUtil().getEntityManager();
		em.getTransaction().begin();

		em.merge(t);

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

	public List<T> listar() {
		EntityManager em = new JPAUtil().getEntityManager();
		CriteriaQuery<T> query = em.getCriteriaBuilder().createQuery(classe);
		query.select(query.from(classe));

		List<T> lista = em.createQuery(query).getResultList();

		em.close();
		return lista;
	}

	public T buscar(int id) {
		EntityManager em = new JPAUtil().getEntityManager();
		T instancia = em.find(classe, id);
		em.close();
		return instancia;
	}



}

e a classe JPAUtil.

public class JPAUtil {

	private static EntityManagerFactory emf = Persistence
			.createEntityManagerFactory("postgres");

	public EntityManager getEntityManager() {
		return emf.createEntityManager();
	}

	public void close(EntityManager em) {
		em.close();
	}
}

obrigado ambos pela ajuda.

Realmente muito estranho. Aparentemente não tem nada errado. Se o insert ta sendo feito normalmente, e ali no seu código tem o commit… Era pra funcionar.

Colocar um break point na linha “em.getTransaction().commit();” do seu método salvar, e observa se o insert ocorre exatamente depois que essa linha é executada.