11
respostas

javax.persistence.PersistenceException

Meu metodo Atualizar da PessoaBean faz uma atualização nas informações da pessoa, mas estou encontrando o seguinte problema:

jul 25, 2016 11:15:58 AM com.sun.faces.lifecycle.InvokeApplicationPhase execute
ADVERTÊNCIA: #{pessoaMB.atualizar()}: javax.persistence.PersistenceException: org.hibernate.PropertyValueException: not-null property references a null or transient value: br.com.arena.model.Pessoa.email
javax.faces.FacesException: #{pessoaMB.atualizar()}: javax.persistence.PersistenceException: org.hibernate.PropertyValueException: not-null property references a null or transient value: br.com.arena.model.Pessoa.email
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118)
    at javax.faces.component.UICommand.broadcast(UICommand.java:315)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:670)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)
Caused by: javax.faces.el.EvaluationException: javax.persistence.PersistenceException: org.hibernate.PropertyValueException: not-null property references a null or transient value: br.com.arena.model.Pessoa.email
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:101)
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
    ... 28 more
Caused by: javax.persistence.PersistenceException: org.hibernate.PropertyValueException: not-null property references a null or transient value: br.com.arena.model.Pessoa.email
    at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:614)
    at org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:244)
    at br.com.arena.dao.PessoaDAO.atualizar(PessoaDAO.java:33)
    at br.com.arena.controller.PessoaBean.atualizar(PessoaBean.java:47)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:247)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:267)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
    ... 29 more
Caused by: org.hibernate.PropertyValueException: not-null property references a null or transient value: br.com.arena.model.Pessoa.email
    at org.hibernate.engine.Nullability.checkNullability(Nullability.java:95)
    at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:313)
    at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
    at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)
    at org.hibernate.ejb.event.EJB3MergeEventListener.saveWithGeneratedId(EJB3MergeEventListener.java:43)
    at org.hibernate.event.def.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:238)
    at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:170)
    at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:81)
    at org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:704)
    at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:688)
    at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:692)
    at org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:235)
    ... 39 more

jul 25, 2016 11:15:58 AM org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [Faces Servlet] in context with path [/arena] threw exception [javax.persistence.PersistenceException: org.hibernate.PropertyValueException: not-null property references a null or transient value: br.com.arena.model.Pessoa.email] with root cause
org.hibernate.PropertyValueException: not-null property references a null or transient value: br.com.arena.model.Pessoa.email
    at org.hibernate.engine.Nullability.checkNullability(Nullability.java:95)
    at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:313)
    at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
    at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)
    at org.hibernate.ejb.event.EJB3MergeEventListener.saveWithGeneratedId(EJB3MergeEventListener.java:43)
    at org.hibernate.event.def.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:238)
    at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:170)
    at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:81)
    at org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:704)
    at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:688)
    at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:692)
    at org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:235)
    at br.com.arena.dao.PessoaDAO.atualizar(PessoaDAO.java:33)
    at br.com.arena.controller.PessoaBean.atualizar(PessoaBean.java:47)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:247)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:267)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
    at javax.faces.component.UICommand.broadcast(UICommand.java:315)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:670)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)

PessoaBean:

public String atualizar() {
        getPessoaDAO().atualizar(pessoa);
        return "perfil.xhtml";
    }

PessoaDAO:

public void atualizar(Pessoa pessoa){
        getEm().getTransaction().begin();
        getEm().merge(pessoa);
        getEm().getTransaction().commit();
    }

PessoaModel:

@Entity
public class Pessoa implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column (name = "id_Pessoa")
    private Integer id;

    @Column(unique = true,nullable = false)
    private String nomeUsuario;

    @Column(nullable = false)
    private String senhaUsuario;

    @Column()
    private String nomeCompleto;

    @Column(unique = true)
    private String email;

    @Column()
    private Integer idade;

    @OneToMany(mappedBy = "pessoa", cascade = CascadeType.MERGE)
    private List<PessoaTime> listaPessoaTime;

Acredito que ele esteja entendendo que o Atualizar deve criar uma nova pessoa, e como email e unique, não pode existir mais de uma pessoa com o mesmo e-mail.

11 respostas

Oi Rafael, vou começar pelo básico. Ele ta dizendo que o email está nulo ou vazio.. Já verificou essa informação no seu objeto pessoa? Usa o debug ou printa o valor do email com sysout.

Sim Alberto, a variável esta com conteudo.

Formulario:

<h:form class="form-label" id="cadastrarTime">
                                <h:inputHidden value="#{timeMB.time.id}" />
                            <div class="form-group row">
                                <label for="thread" class="col-md-2">Nome do Time:</label>
                                <div class="col-md-10">
                                    <h:inputText  type="nome" class="form-control" id="nome" value="#{timeMB.time.nome}"/>
                                </div>
                            </div>

                            <div class="form-group row">
                                <label for="description" class="col-md-2">Senha do Time:</label>
                                <div class="col-md-10">
                                    <h:inputText  type="password" class="form-control" id="senha" value="#{timeMB.time.senhaTime}"/>
                                </div>
                            </div>    

                            <div class="text-center">
                                  <h:commandButton   value="Atualizar" class="btn btn-primary btn-lg btn-rounded btn-shadow" 
                                  action="#{timeMB.alteraTime()}"/>
                        </div>
                        </h:form>

Esse e o formulario, ele mostra os valores e me permite alterar ao clicar no botão que carrega o timeMB.alterarTime

Nesse formulário não tem o campo de email.

Desculpe, coloquei o formulário errado. Aqui esta o correto:

<h:form class="form-label" id="Perfil">
                                    <div class="form-group row">
                                        <label for="thread" class="col-md-2">Email:</label>
                                        <div class="col-md-10">
                                            <h:inputText value="#{pessoaMB.usuarioLogado().email}"
                                                type="nome" class="form-control" id="email"
                                                placeholder="Altere seu nome completo" />
                                        </div>
                                    </div>


                                    <div class="form-group row">
                                        <label for="description" class="col-md-2">Idade</label>
                                        <div class="col-md-10">

                                            <h:inputText value="#{pessoaMB.usuarioLogado().idade}"
                                                type="nome" class="form-control" id="idade"
                                                placeholder="Altere sua idade" />
                                        </div>
                                    </div>

                                    <div class="form-group row">
                                        <label for="description" class="col-md-2">Nome
                                            Completo</label>
                                        <div class="col-md-10">

                                            <h:inputText
                                                value="#{pessoaMB.usuarioLogado().nomeCompleto}"
                                                type="nome" class="form-control" id="nomeCompleto"
                                                placeholder="Altere sua idade" />
                                        </div>
                                    </div>

                                    <div class="form-group row">
                                        <label for="description" class="col-md-2">Nome Usuario</label>
                                        <div class="col-md-10">

                                            <h:inputText
                                                value="#{pessoaMB.usuarioLogado().nomeUsuario}"
                                                type="nome" class="form-control" id="nomeUsuario"
                                                placeholder="Altere sua idade" />
                                        </div>
                                    </div>

                                    <div class="form-group row">
                                        <label for="description" class="col-md-2">Senha
                                            Usuario</label>
                                        <div class="col-md-10">
                                            <h:inputText
                                                value="#{pessoaMB.usuarioLogado().senhaUsuario}"
                                                type="nome" class="form-control" id="senha"
                                                placeholder="Altere sua idade" />
                                        </div>
                                    </div>

                                    <h:commandButton action="#{pessoaMB.atualizar()}"
                                        value="Confirmar Edições" id="botaoAlterar"
                                        class="btn btn-lg btn-block btn-rounded btn-shadow btn-primary " />

                                </h:form>

Notei o seguinte,

@Column(unique = true)
    private String email;

Caso eu retire o unique = true ele nao apresenta mais esse problema.

Sim Rafael, o problema é esse. Como está o seu método usuarioLogado() ? Ele retorna o objeto pesssoa que está sendo manipulado nos métodos? O problema está ali.. Aquela variável pessoa aponta para um objeto que não tem email preenchido.

Aqui esta o UsuarioLogado():

public Pessoa usuarioLogado(){
        Pessoa p = null;
        FacesContext context = FacesContext.getCurrentInstance() ;
        Pessoa usuarioLogado = (Pessoa) context.getExternalContext() .getSessionMap().get("usuarioLogado");
        if(usuarioLogado != null){
            p = getPessoaDAO().pessoaLogada(usuarioLogado);
        }        
        return p;
    }

O formulário exibe as informações atuais do Pessoa de usuarioLogado. Voce achou algo de estranho no metodo Atualizar de PessoaBean ?

Estou a um tempo sem resto, mas ainda estou trabalhando no problema. Alguém pode ajudar ?

Vc precisa debugar e ver o valor do email que esta chegando no metodo... Nao tem muito jeito, se o problema eh no email, temos que concentrar o esforco nele. Vc ja verificou se o email do form ta chegando no seu bean? Se no metodo atualiza realmente tem o email?

Sim, o email do form tem valor. Ele ja aparece no formulário de alteracao. Debuguei, e ele esta com o conteúdo.

Problema e na hora de atualizar mesmo. Acredito que seja realmente no metodo.

Se pessoa for um atributo do seu bean, em qual momento ele está sendo atualizado? Pq vc está usando o método usuarioLogado do xhtml, e ele não mexe na variável pessoa do Bean.