Update em uma tabela após salvar (JPA + JSF)!

Pessoal, estou com um problema em um projeto no Eclipse: após salvar um determinado produto, esse produto aparece no banco MySQL Workbench só que não atualiza na lista do xhtml.

Segue os códigos:

Produto.xhtml

<h:form id="formulario">

	<p:messages id="messages" showDetail="true" autoUpdate="true"
		closable="true" />
	<p:panel header="Produto">

		<h:panelGrid id="gridProduto" columns="2" cellpadding="3">

			<h:outputText value="Código:"></h:outputText>
			<p:inputText id="codigo" style="width:350px"
				value="#{produtoControle.produto.codigo}" />

			<h:outputText value="Descrição:"></h:outputText>
			<p:inputText id="descricao" style="width:350px"
				value="#{produtoControle.produto.descricao}" />

			<h:outputText value="Quantidade:"></h:outputText>
			<p:inputText id="quantidade" style="width:350px"
				value="#{produtoControle.produto.quantidade}" />

			<h:outputText value="Preço:"></h:outputText>
			<p:inputText id="preco" style="width:50px"
				value="#{produtoControle.produto.preco}" />

			<h:outputText value="Detalhes:"></h:outputText>
			<p:inputText id="detalhes" style="width:50px"
				value="#{produtoControle.produto.detalhes}" />

		</h:panelGrid>


		<p:commandButton id="botaoSalvar" value="SALVAR"
			actionListener="#{produtoControle.salvar}"
			update="formulario:gridProduto, formulario:tabelaProdutos" />

		<p:commandButton id="botaoPesquisar" value="PESQUISAR"
			actionListener="#{produtoControle.pesquisar}"
			update="formulario:tabelaProdutos" />

		<p:commandButton id="botaoLimpar" value="LIMPAR"
			actionListener="#{produtoControle.limpar}"
			update="formulario:gridProduto" />
		
		

	</p:panel>

	<p:dataTable id="tabelaProdutos"
		value="#{produtoControle.listaProdutos}" var="produto"
		paginator="true" rows="5">

		<p:column headerText="Codigo">
			<h:outputText value="#{produto.codigo}" />
		</p:column>

		<p:column headerText="Descricao">
			<h:outputText value="#{produto.descricao}" />
		</p:column>

		<p:column headerText="Quantidade">
			<h:outputText value="#{produto.quantidade}" />
		</p:column>

		<p:column headerText="Preco">
			<h:outputText value="#{produto.preco}" />
		</p:column>

		<p:column headerText="Detalhes">
			<h:outputText value="#{produto.detalhes}" />
		</p:column>

	</p:dataTable>
</h:form>

</h:body>

ProdutoControle.java

package controle;

import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import dao.ProdutoDao;
import entidade.Produto;

@ManagedBean(name = "produtoControle")
@SessionScoped
public class ProdutoControle {
	private Produto produto;
	private List<Produto> listaProdutos = null;

public ProdutoControle() {
	produto = new Produto();
}

public Produto getProduto() {
	return produto;
}

public void setProduto(Produto produto) {
	this.produto = produto;
}

public List<Produto> getListaProdutos() {
	return listaProdutos;
}

public void setListaProdutos(List<Produto> listaProdutos) {
	this.listaProdutos = listaProdutos;
}

public void salvar() {
	ProdutoDao dao = new ProdutoDao();
	dao.salvar(produto);
	exibirMensagemSucesso(produto.getDescricao() + " salvo com sucesso!");
	this.produto = new Produto();
}

public void pesquisar() {
	ProdutoDao dao = new ProdutoDao();
	this.listaProdutos = dao.pesquisar(produto.getDescricao());
	System.out.println(this.listaProdutos);
}

public void apagar(Produto produto) {
	ProdutoDao dao = new ProdutoDao();
	dao.apagar(produto);
	this.listaProdutos.remove(produto);
}

public void limpar() {
	this.produto = new Produto();
	this.listaProdutos = null;
}

private void exibirMensagemSucesso(String mensagem) {
	FacesContext.getCurrentInstance().addMessage(null,
			new FacesMessage(FacesMessage.SEVERITY_INFO, null, mensagem));
}

}

ProdutoDao.java

package dao;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import entidade.Produto;
import util.JpaUtil;

public class ProdutoDao {
	
	public void salvar(Produto produto) {
		EntityManager em = JpaUtil.getEntityManager();
		EntityTransaction transaction = em.getTransaction();
		transaction.begin();
		em.persist(produto);
		transaction.commit();
	}

public List<Produto> pesquisar(String descricao) {
	EntityManager em = JpaUtil.getEntityManager();
	TypedQuery<Produto> query = em.createQuery("from Produto p where p.descricao like :descricao ", Produto.class);
	return query.setParameter("descricao", descricao).getResultList();
}

public void apagar(Produto produto) {
	EntityManager em = JpaUtil.getEntityManager();
	EntityTransaction transaction = em.getTransaction();
	transaction.begin();
	em.remove(produto);
	transaction.commit();
}

@SuppressWarnings("unchecked")
public List<Produto> listar() {
	EntityManager em = JpaUtil.getEntityManager();
	Query query = em.createQuery("from Produto");
	return query.getResultList();
}

public void atualizar(Produto produto) {
	EntityManager em = JpaUtil.getEntityManager();
	EntityTransaction transaction = em.getTransaction();
	transaction.begin();
	em.merge(produto);
	transaction.commit(); } 

Produto.java

package entidade;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "produto")
public class Produto implements Serializable {
	private static final long serialVersionUID = -2787154004939294333L;
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	@Column(name = "codigo", nullable = false)
	private String codigo;
	@Column(nullable = false)
	private String descricao;
	@Column(nullable = false)
	private int quantidade;
	@Column(nullable = false)
	private String preco;
	@Column(nullable = false)
	private String detalhes;

public Long getId() {
	return id;
}

public void setId(Long id) {
	this.id = id;
}

public String getCodigo() {
	return codigo;
}

public void setCodigo(String codigo) {
	this.codigo = codigo;
}

public String getDescricao() {
	return descricao;
}

public void setDescricao(String descricao) {
	this.descricao = descricao;
}

public int getQuantidade() {
	return quantidade;
}

public void setQuantidade(int quantidade) {
	this.quantidade = quantidade;
}

public String getPreco() {
	return preco;
}

public void setPreco(String preco) {
	this.preco = preco;
}

public String getDetalhes() {
	return detalhes;
}

public void setDetalhes(String detalhes) {
	this.detalhes = detalhes;
}

@Override
public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + ((id == null) ? 0 : id.hashCode());
	return result;
}

@Override
public boolean equals(Object obj) {
	if (this == obj)
		return true;
	if (obj == null)
		return false;
	if (getClass() != obj.getClass())
		return false;
	Produto other = (Produto) obj;
	if (id == null) {
		if (other.id != null)
			return false;
	} else if (!id.equals(other.id))
		return false;
	return true;
}

@Override
public String toString() {
	return "Produto [id=" + id + ", codigo=" + codigo + ", quantidade=" + quantidade + ",preco=" + preco + ", detalhes="
			+ detalhes + "]";
}

Alguém sabe como resolver?!

Gaabmmeio,

Muito simples, quando você salva (persiste no banco), ele não sabe que o elemento é para ser listado. Você precisa acrescentá-lo na listaProdutos ou rodar uma nova busca no banco de dados dos produtos que lá se encontram.

Ou seja, ou você faz

 public void salvar() {
 	ProdutoDao dao = new ProdutoDao();
 	dao.salvar(produto);
 	exibirMensagemSucesso(produto.getDescricao() + " salvo com sucesso!");
 	getListaProdutos().add(produto);
 	this.produto = new Produto();
 }

Se for necessário carregar a página (acredito que não será pelo PrimeFaces), use AJAX

Falows

Funcionou! Obrigada!