Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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.