Pessoal, estou com o seguinte problema: meu sistema possui uma tela de cadastro, onde o usuário pode cadastrar, remover e atualizar especialidades médicas. Cada especialidade possui um código e um nome. Não se pode cadastrar uma especialidade com o nome de uma especialidade já cadastrada, nem com um código já cadastrado.
O problema é que quando vou atualizar uma especialidade, se mudo o nome ou o código para um valor já cadastrado, essa atualização não é realizada, ou seja, não é salvo no banco de dados, mas atualiza o valor que aparece na tabela da página, só voltando a apresentar o valor armazenar no banco de dados depois que dou refresh na página.
Alguém tem idéia como posso resolver isso?
O código da minha tela é:
<!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:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<h:head></h:head>
<body>
<ui:composition template="_template.xhtml">
<ui:define name="corpo">
<br></br>
<br></br>
<h:form id="formularioCadastro">
<p:growl></p:growl>
<div align="center" >
<h:panelGrid columns="2" cellpadding="2" cellspacing = "10" width="360">
<h:outputText value="Especialidade:" />
<p:inputText value="#{especialidadeBean.especialidade.nome}"></p:inputText>
<h:outputText value="Código:" />
<p:inputText value="#{especialidadeBean.especialidade.numero}"></p:inputText>
<p:commandButton value="Salvar" action="#{especialidadeBean.salvar}" update="@form :formularioTabela"></p:commandButton>
</h:panelGrid>
<br></br>
<br></br>
</div>
</h:form>
<h:form id="formularioTabela">
<div align="center" >
<p:dataTable value="#{especialidadeBean.lista}" var = "especialidade"
style="width:500px;"
paginator="true" rows="10"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
rowsPerPageTemplate="5,10,15">
<f:facet name="header">
Especialidades
</f:facet>
<p:column id="numero" sortBy="#{especialidade.numero}">
<f:facet name="header">
<h:outputText value="Código " />
</f:facet>
<h:outputText value="#{especialidade.numero}" />
</p:column>
<p:column id="nome" sortBy="#{especialidade.nome}">
<f:facet name="header">
<h:outputText value="Nome" />
</f:facet>
<h:outputText value="#{especialidade.nome}" />
</p:column>
<p:column>
<p:commandButton value="Remover" action="#{especialidadeBean.remover}" update="@form :formularioTabela">
<f:setPropertyActionListener target="#{especialidadeBean.especialidade}" value="#{especialidade}"></f:setPropertyActionListener>
</p:commandButton>
</p:column>
<p:column>
<p:commandButton value="Alterar" update="@form :formularioCadastro">
<f:setPropertyActionListener target="#{especialidadeBean.especialidade}" value="#{especialidade}"></f:setPropertyActionListener>
</p:commandButton>
</p:column>
</p:dataTable>
</div>
</h:form>
</ui:define>
</ui:composition>
</body>
</html>
Minha classe Bean:
package br.pe.gov.ses.pme.mb;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import br.pe.gov.ses.pme.dao.DAO;
import br.pe.gov.ses.pme.dao.EspecialidadeDAO;
import br.pe.gov.ses.pme.modelo.Especialidade;
@ManagedBean
@ViewScoped
public class EspecialidadeBean {
private Especialidade especialidade = new Especialidade();
private DAO<Especialidade> dao = new DAO<Especialidade>(Especialidade.class);
private List<Especialidade> lista;
@Inject
private EspecialidadeDAO especialidadeDAO;
public EspecialidadeBean(){
}
public EspecialidadeBean(EspecialidadeDAO especialidadeDAO){
this.especialidadeDAO = especialidadeDAO;
}
@PostConstruct
public void init() {
setLista(dao.listarTodos());
}
public void salvar(){
boolean salvar = this.especialidadeDAO.permitidoSalvar(especialidade);
if(salvar){
if(this.especialidade.getId() == null){
dao.adiciona(especialidade);
}else{
dao.atualiza(especialidade);
}
this.especialidade = new Especialidade();
lista = dao.listarTodos();
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Especialidade Cadastrada!", ""));
}else{
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Especialidade já cadastrada!", ""));
}
}
public void remover(){
if(this.especialidade.getId() != null){
dao.remove(especialidade);
especialidade = new Especialidade();
lista = dao.listarTodos();
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Operação realizada com sucesso!", ""));
}
}
public List<Especialidade> getLista() {
return lista;
}
public void setLista(List<Especialidade> lista) {
this.lista = lista;
}
public Especialidade getEspecialidade() {
return especialidade;
}
public void setEspecialidade(Especialidade especialidade) {
this.especialidade = especialidade;
}
public String cancelar() {
especialidade = new Especialidade();
return "Especialidade.jsf?faces-redirect=true";
}
}
Lembrando que o problema está na atualização da página, a especialidade não é salva no banco de dados, mas é atualizada na tabela. É preciso dar um refresh na página para que a tabela volte a mostrar o que está armazenado no banco de dados.