Página não atualiza ao excluir

Bom dia, conseguem identificar abaixo nos meu projeto por que a página não atualiza automaticamente ao excluir uma linha de código, pois vejo no console que a linha foi apagada, mas a linha só sai da tela ao dar refresh na página , ou seja, manualmente.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
	xmlns:h="http://xmlns.jcp.org/jsf/html"
	xmlns:f="http://xmlns.jcp.org/jsf/core"
	xmlns:p="http://primefaces.org/ui">

<h:head>
	<title>Cursos cadastrados</title>
</h:head>
<h:body>
	<h:form>
		<p:panel header="Cursos cadastrados">
			<p:button value="Novo Curso" outcome="curso_formulario" />
			
			<h:form>
				
				<p:dataTable emptyMessage="Nenhum registro encontrado."
					value="#{cursoBean.cursos}" var="curso">
					<p:column headerText="Nome">
						<h:outputText value="#{curso.nome}" />
					</p:column>
					<p:column headerText="Duração">
						<h:outputText value="#{curso.duracao}" />
					</p:column>
					<p:column headerText="Tipo">
						<h:outputText value="#{curso.tipo.label}" />
					</p:column>
					<p:column headerText="Data Criação">
						<h:outputText value="#{curso.dataCriacao}">
							<f:convertDateTime pattern="dd/MM/yyyy" />
						</h:outputText></p:column>
					
					<p:column>
						<p:commandLink value="Editar"
							action="#{cursoBean.editar(curso)}" /> -
						<p:commandLink value="Excluir"
							action="#{cursoBean.excluir(curso)}" update="@form" />	
					</p:column>
				</p:dataTable>
			</h:form>
		</p:panel>
	</h:form>
</h:body>
</html>

package escola.musica.bean;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
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 escola.musica.dao.CursoDAO;
import escola.musica.modelo.Curso;
import escola.musica.modelo.TipoCurso;

@ManagedBean
@SessionScoped
public class CursoBean {

	private Curso curso = new Curso();
	private List<TipoCurso> tipos = Arrays.asList(TipoCurso.values());
	private List<Curso> cursos = new ArrayList<Curso>();

	public CursoBean() {
		cursos = new CursoDAO().listarTodos();
		curso = new Curso();
	}
	
	public String salvar() {
		new CursoDAO().salvar(curso);;
		cursos = new CursoDAO().listarTodos();
		
		curso = new Curso();
		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Curso salvo com sucesso."));
		return "curso_lista?faces-redirect=true";
	}
	
	public String editar(Curso curso) {
		this.curso = curso;
		return "curso_formulario?faces-redirect=true";
	}
	
	public void excluir(Curso curso) {
		new CursoDAO().excluir(curso);
		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Curso excluido com sucesso."));
		cursos = new CursoDAO().listarTodos();
		
	}

	public List<Curso> getCursos() {
		return cursos;
	}

	public void setCursos(List<Curso> cursos) {
		this.cursos = cursos;
	}

	public List<TipoCurso> getTipos() {
		return tipos;
	}

	public void setTipos(List<TipoCurso> tipos) {
		this.tipos = tipos;
	}

	public Curso getCurso() {
		return curso;
	}

	public void setCurso(Curso curso) {
		this.curso = curso;
	}

	public String getDataAtual() {
		return new SimpleDateFormat("dd/MM/yyyy").format(new Date());
	}
}


package escola.musica.dao;

import java.util.List;

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

import escola.musica.modelo.Curso;

public class CursoDAO {

	public void salvar(Curso curso) {
		EntityManager entityManager = JPAUtil.getEntityManager();

		entityManager.getTransaction().begin();

		entityManager.merge(curso);

		entityManager.getTransaction().commit();

		entityManager.close();
	}
	
	@SuppressWarnings("unchecked")
	public List<Curso> listarTodos() {
		
		EntityManager entityManager = JPAUtil.getEntityManager();
		
		Query query = entityManager.createQuery("from Curso");
		
		return entityManager.createQuery("from Curso").getResultList();
	}

	public void excluir(Curso curso) {
		
		EntityManager entityManager = JPAUtil.getEntityManager();
		
		entityManager.getTransaction().begin();
		
		curso = entityManager.merge(curso);
		
		entityManager.remove(curso);
		
		entityManager.getTransaction().commit();
		
		entityManager.close();
		
		
	}
}

Tente assim …

public void excluir(Curso curso) {
	new CursoDAO().excluir(curso);
	FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Curso excluido com sucesso."));
	cursos = new CursoDAO().listarTodos();
    curso = new Curso();
}
  1. Não acho que seja necessário dois forms nesse seu caso. Remova o de dentro do panel.

  2. Para ações, prefira trabalhar com commandButtons

  3. Defina um id para o formulário e para a tabela.

  4. Tente assim:

    <h:head>
    Cursos cadastrados
    </h:head>
    <h:body>
    <h:form id=“form”>
    <p:panel header=“Cursos cadastrados”>
    <p:button value=“Novo Curso” outcome=“curso_formulario” />

     			<p:dataTable emptyMessage="Nenhum registro encontrado."
     				value="#{cursoBean.cursos}" var="curso" id="tabela">
     				<p:column headerText="Nome">
     					<h:outputText value="#{curso.nome}" />
     				</p:column>
     				<p:column headerText="Duração">
     					<h:outputText value="#{curso.duracao}" />
     				</p:column>
     				<p:column headerText="Tipo">
     					<h:outputText value="#{curso.tipo.label}" />
     				</p:column>
     				<p:column headerText="Data Criação">
     					<h:outputText value="#{curso.dataCriacao}">
     						<f:convertDateTime pattern="dd/MM/yyyy" />
     					</h:outputText></p:column>
     				
     				<p:column>
     					<p:commandLink value="Editar"
     						action="#{cursoBean.editar(curso)}" /> -
     					<p:commandButton value="Excluir"
     						action="#{cursoBean.excluir(curso)}" update="form:tabela" />	
     				</p:column>
     			</p:dataTable>
     	</p:panel>
     </h:form>
    

    </h:body>

Obrigado ao @Gabriel_Cardoso1 e @raphaeloneves pela ajuda. Agora consigo deletar as linhas do banco de dados diretamente na tela.

Tmj @luigi.oliveira. Abraço.

Falo @luigi.oliveira :v: