Porque você colocou essa classe como bean do jsf ?
Então… num treinamento que eu cheguei a fazer, o professor fez dessa maneira…
faltou ali o (eager=true), assim…
@ManagedBean(eager=true)
@ApplicationScoped
public class EntityManagerBuilder implements Serializable{
//....
e no meu bean, começo assim
public class UsuarioBean implements Serializable{
@ManagedProperty(value="#{entityManagerBuilder.entityManager}")
private EntityManager entityManager;
//.....
Se estiver usando cdi ou ejb pode injetar assim
@PersistenceContext(unitName=“nome da sua unidade de persistencia”)
private EntityManager em;
você faz a operação da jpa no managed bean ?
isso…
@ManagedBean
@ViewScoped
public class UsuarioBean implements Serializable{
@ManagedProperty(value="#{entityManagerBuilder.entityManager}")
private EntityManager entityManager;
private static final long serialVersionUID = 1L;
private Usuario selecionado;
private List<Usuario> lista;
public void salvar() {
FacesContext context = FacesContext.getCurrentInstance();
try {
getEntityManager().getTransaction().begin();
if (getSelecionado().getCod_usuario() == null) {
getEntityManager().persist(selecionado);
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Cadastro realizado com Sucesso!", ""));
}else{
getEntityManager().merge(selecionado);
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Cadastro alterado com Sucesso!", ""));
resetUser();
listar_usuario();
}
getEntityManager().getTransaction().commit();
selecionado = null;
} catch (Exception e) {
System.out.println("Erro: Exception");
}
}
//....MAIS MÉTODOS E GETTERS E SETTERS
entao.
O erro lá da session é porque você não a fechou.
ela tem que ser fechada após cada transação.
Coloca no final um finally e chama
getEntityManager().close();
E depois separa essa aplicação em mais camadas.
Imagina se depois você não tem mais que fazê-la com jsf ou então usar outro framework
beleza entao… obrigado (:
o certo seria eu criar um DAO para cada entidade né?
tipo… no bean ficar só os métodos, mas para cada transação chamar o dao dai… tipo isso?
Nínguém nunca precisou fazer isso??
Eu não queria simplesmente dizer que houve um erro durante o cadastro… queria poder dizer qual foi esse erro…
eu pus assim na exception para testar:
} catch (PersistenceException e) {
System.out.println("Persistence cause: " + e.getCause());
System.out.println("Persistence msg: " + e.getMessage());
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro persistence!",""));
}
Ele imprime no console:
Persistence cause: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: ERRO: duplicar valor da chave viola a restrição de unicidade "u_cpf"
Persistence msg: Error while committing the transaction
Não tem como eu pegar o erro que ta no getCause() e de alguma forma mostrar para o usuário??
outra coisa é que nem isso:
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro persistence!",""));
ele mostra na tela
Paulo,
Como ele está passando no catch e você está adicionando a mensagem (a principio parece estar correto), pode ser alguma falha no fluxo da tela!
Como você chama esse método? Via ajax? Se chama via ajax tem que dar um uptade no componente de mensagens. Se ele estiver dentro do mesmo form, de o update no @form
Pode postar aqui seu XHTML?
Att.
Olá Ronaldo, obrigado pela ajuda!
Então, eu dou um update no form sim, além de também eu deixar a propriedade autoUpdate=“true” no componente… vo postar aqui o xhtml de uma das páginas q tentei fazer isso e o metodo. Vo por o xhtml inteiro, para caso haja algum problema de componente fora do lugar certo
<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">
<ui:composition template="/sico/novotemplateSico.xhtml">
<ui:define name="titulo">Cadastro Usuário | SICO</ui:define>
<ui:define name="nomepagina">Cadastro Usuário</ui:define>
<ui:define name="icone"><p:graphicImage url="/resources/images/newuser.png" alt="Cadastro" title="Cadastro"
width="95" height="95" style="padding-right: 80px; padding-bottom: 15px;" /></ui:define>
<ui:define name="conteudo">
<div id="conteudo">
<p:ajaxStatus style="width:64px;height:64px;position:fixed;left:50%;top:50%;margin-top:50px;">
<f:facet name="start">
<h:graphicImage value="/resources/images/ajax-loader1.gif" />
</f:facet>
<f:facet name="complete">
<h:outputText value="" />
</f:facet>
</p:ajaxStatus>
<h:form id="form" prependId="false">
<p:panel>
<br />
<div class="titulo">USUÁRIOS</div>
<p:separator />
<br />
<div style="margin: 0 auto; width: 800px">
<h:panelGrid rendered="#{ctrlManterUsuario.panel}" columns="2" cellpadding="5" style="text-align: right">
<h:outputLabel value="Nome Completo: * " />
<h:panelGroup>
<p:inputText value="#{ctrlManterUsuario.selecionado.nome}" style="width: 600px" />
</h:panelGroup>
<h:outputLabel value="Endereço: " />
<h:panelGroup>
<p:inputText value="#{ctrlManterUsuario.selecionado.endereco}" style="width: 440px"/>
<p:spacer width="20" height="0" />
<h:outputLabel value="Número: " />
<p:inputText value="#{ctrlManterUsuario.selecionado.numero}" style="width: 70px"/>
</h:panelGroup>
<h:outputLabel value="Complemento: " />
<h:panelGroup>
<p:inputText value="#{ctrlManterUsuario.selecionado.complemento}" style="width: 200px"/>
<p:spacer width="20" height="0" />
<h:outputLabel value="Bairro: " />
<p:inputText value="#{ctrlManterUsuario.selecionado.bairro}" style="width: 150px"/>
<p:spacer width="20" height="0" />
<h:outputLabel value="CEP: " />
<p:inputMask value="#{ctrlManterUsuario.selecionado.cep}" mask="99999-999" style="width: 100px"/>
</h:panelGroup>
<h:outputLabel value="Cidade: " />
<h:panelGroup>
<p:inputText value="#{ctrlManterUsuario.selecionado.cidade}" style="width: 186px"/>
<p:spacer width="20" height="0" />
<h:outputLabel value="Estado: " />
<p:inputMask mask="aa" value="#{ctrlManterUsuario.selecionado.uf}" style="width: 100px"/>
<p:spacer width="20" height="0" />
<h:outputLabel value="CPF: * " />
<p:inputMask value="#{ctrlManterUsuario.selecionado.cpf}" mask="99999999999" style="width: 150px"/>
</h:panelGroup>
<h:outputLabel value="RG: * " style="text-align: right"/>
<h:panelGroup>
<p:inputText value="#{ctrlManterUsuario.selecionado.rg}" style="width: 131px" />
<p:spacer width="20" height="0" />
<h:outputLabel value="Telefone 1: * " />
<p:inputMask value="#{ctrlManterUsuario.selecionado.fone1}" mask="(99)9999-9999" style="width: 122px"/>
<p:spacer width="20" height="0" />
<h:outputLabel value="Telefone 2: " />
<p:inputMask value="#{ctrlManterUsuario.selecionado.fone2}" mask="(99)9999-9999" style="width: 122px"/>
</h:panelGroup>
<h:outputLabel value="Nome de Usuário: * " />
<h:panelGroup>
<p:inputText value="#{ctrlManterUsuario.selecionado.username}" style="width: 125px"/>
<p:spacer width="20" height="0" />
<h:outputLabel value="Senha: * " />
<p:password id="Senha" value="#{ctrlManterUsuario.selecionado.senha}" feedback="true" style="width: 110px" promptLabel="Digite uma senha" weakLabel="Fraca"
goodLabel="Boa" strongLabel="Forte" match="Confirme_senha" required="true" validatorMessage="Senha e Confirmação de Senha devem ser iguais"/>
<p:spacer width="20" height="0" />
<h:outputLabel value="Confirme a senha: * " />
<p:password id="Confirme_senha" style="width: 110px" required="true"/>
</h:panelGroup>
<h:outputLabel value="Tipo de Usuário: * " />
<p:selectOneRadio value="#{ctrlManterUsuario.selecionado.tipo_usuario}">
<f:selectItem itemLabel="Dentista" itemValue="dentista"/>
<p:spacer width="20" height="0" />
<f:selectItem itemLabel="Funcionário" itemValue="funcionario"/>
</p:selectOneRadio>
<p:spacer />
<p:spacer />
*Campos Obrigatórios
</h:panelGrid>
</div>
<div style="margin: 0 auto; width: 800px; text-align: left">
<p:spacer/>
<p:separator />
<p:commandButton action="#{ctrlManterUsuario.inserirUsuario()}" rendered="#{ctrlManterUsuario.panel}" update="@form" value="Cadastrar" title="Cadastrar Funcionário" style="margin: 0 auto" icon="ui-icon-check" />
<div style="margin: 0 auto; width: 800px; text-align: center;">
<p:commandButton action="#{ctrlManterUsuario.novo_cadastro()}" global="false" rendered="#{ctrlManterUsuario.botao_novo}" update="@form" value="Novo Cadastro" title="Cadastrar novo Funcionário" icon="ui-icon-plusthick" />
</div>
<p:messages id="msg" autoUpdate="true" />
</div>
</p:panel>
</h:form>
</div>
</ui:define>
</ui:composition>
</html>
Método:
public void inserirUsuario(){
FacesContext context = FacesContext.getCurrentInstance();
boolean cpf;
try {
if(getSelecionado().getSenha().length() >= 6){
if (!getSelecionado().getRg().matches("[0-9]+")){
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Insira apenas números para o RG!",""));
return;
} else {
cpf = validaCPF(getSelecionado().getCpf());
if(cpf == true){
usuarioDAO.beginTransaction();
String nomeSacento = remover(getSelecionado().getNome());
selecionado.setNomeSemAcento(nomeSacento);
usuarioDAO.save(selecionado);
usuarioDAO.commitAndCloseTransaction();
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Usuário cadastrado com Sucesso!",""));
resetUser();
panel = false;
botao_novo = true;
} else {
System.out.println("cpf invalido");
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "CPF Inválido!",""));
}
}
} else {
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Para sua segurança insira uma senha de pelo menos 6 caracteres!",""));
return;
}
} catch (PersistenceException e){
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "ERRO!",""));
System.out.println(e.getCause());
System.out.println("entro no persistencia");
} catch (Exception e) {
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "ERRO!",""));
System.out.println(e.getCause());
}
}
Obrigado desde já!!!
Abraçoos