Dúvida JSF + Hibernate - URGENTE!

4 respostas
F

Pessoal, boa noite!
Sou iniciante em JSF e estou com um problema.
Em uma tela de meu sistema estou usando o DataTable do PrimeFaces... quando vou editar um caso, a atualização é feita no banco e em seguida aparece a seuinte exceção:

Set 05, 2012 11:24:17 PM com.sun.faces.lifecycle.InvokeApplicationPhase execute
Advertência: /campanhas.xhtml @69,22 listener="#{campanhasBean.atualizar}": org.hibernate.TransientObjectException: The given object has a null identifier: br.com.recuperacao.model.Campanhas
javax.el.ELException: /campanhas.xhtml @69,22 listener="#{campanhasBean.atualizar}": org.hibernate.TransientObjectException: The given object has a null identifier: br.com.recuperacao.model.Campanhas
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:111)
	at org.primefaces.component.behavior.ajax.AjaxBehaviorListenerImpl.processAjaxBehavior(AjaxBehaviorListenerImpl.java:42)
	at org.primefaces.event.RowEditEvent.processListener(RowEditEvent.java:41)
	at javax.faces.component.behavior.BehaviorBase.broadcast(BehaviorBase.java:102)
	at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769)
	at javax.faces.component.UIData.broadcast(UIData.java:893)
	at javax.faces.component.UIData.broadcast(UIData.java:915)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:787)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1252)
	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:508)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)
Caused by: org.hibernate.TransientObjectException: The given object has a null identifier: br.com.recuperacao.model.Campanhas
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.getUpdateId(DefaultSaveOrUpdateEventListener.java:272)
	at org.hibernate.event.def.DefaultUpdateEventListener.getUpdateId(DefaultUpdateEventListener.java:72)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:240)
	at org.hibernate.event.def.DefaultUpdateEventListener.performSaveOrUpdate(DefaultUpdateEventListener.java:57)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
	at org.hibernate.impl.SessionImpl.fireUpdate(SessionImpl.java:742)
	at org.hibernate.impl.SessionImpl.update(SessionImpl.java:730)
	at org.hibernate.impl.SessionImpl.update(SessionImpl.java:722)
	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.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:345)
	at $Proxy21.update(Unknown Source)
	at br.com.recuperacao.dao.CampanhasDAOHibernate.atualizar(CampanhasDAOHibernate.java:27)
	at br.com.recuperacao.rn.CampanhasRN.atualizar(CampanhasRN.java:24)
	at br.com.recuperacao.bean.CampanhasBean.atualizar(CampanhasBean.java:43)
	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:191)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
	... 24 more

javax.faces.FacesException: /campanhas.xhtml @69,22 listener="#{campanhasBean.atualizar}": org.hibernate.TransientObjectException: The given object has a null identifier: br.com.recuperacao.model.Campanhas
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:89)
	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:508)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)
Caused by: javax.el.ELException: /campanhas.xhtml @69,22 listener="#{campanhasBean.atualizar}": org.hibernate.TransientObjectException: The given object has a null identifier: br.com.recuperacao.model.Campanhas
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:111)
	at org.primefaces.component.behavior.ajax.AjaxBehaviorListenerImpl.processAjaxBehavior(AjaxBehaviorListenerImpl.java:42)
	at org.primefaces.event.RowEditEvent.processListener(RowEditEvent.java:41)
	at javax.faces.component.behavior.BehaviorBase.broadcast(BehaviorBase.java:102)
	at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769)
	at javax.faces.component.UIData.broadcast(UIData.java:893)
	at javax.faces.component.UIData.broadcast(UIData.java:915)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:787)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1252)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	... 15 more
Caused by: org.hibernate.TransientObjectException: The given object has a null identifier: br.com.recuperacao.model.Campanhas
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.getUpdateId(DefaultSaveOrUpdateEventListener.java:272)
	at org.hibernate.event.def.DefaultUpdateEventListener.getUpdateId(DefaultUpdateEventListener.java:72)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:240)
	at org.hibernate.event.def.DefaultUpdateEventListener.performSaveOrUpdate(DefaultUpdateEventListener.java:57)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
	at org.hibernate.impl.SessionImpl.fireUpdate(SessionImpl.java:742)
	at org.hibernate.impl.SessionImpl.update(SessionImpl.java:730)
	at org.hibernate.impl.SessionImpl.update(SessionImpl.java:722)
	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.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:345)
	at $Proxy21.update(Unknown Source)
	at br.com.recuperacao.dao.CampanhasDAOHibernate.atualizar(CampanhasDAOHibernate.java:27)
	at br.com.recuperacao.rn.CampanhasRN.atualizar(CampanhasRN.java:24)
	at br.com.recuperacao.bean.CampanhasBean.atualizar(CampanhasBean.java:43)
	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:191)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
	... 24 more
CampanhasBean:
package br.com.recuperacao.bean;

import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;

import org.primefaces.event.RowEditEvent;

import br.com.recuperacao.model.Campanhas;
import br.com.recuperacao.rn.CampanhasRN;

@ManagedBean(name = "campanhasBean")
@RequestScoped
public class CampanhasBean {

	private Campanhas campanhas = new Campanhas();
	private List<Campanhas> listaCampanhas;

	public CampanhasBean() {
		populaLista();
	}

	public String salvar() {

		FacesContext context = FacesContext.getCurrentInstance();

		CampanhasRN campanhasRN = new CampanhasRN();
		campanhasRN.salvar(this.campanhas);
		return "campanhasSucesso";

	}

	public void populaLista() {
		CampanhasRN campanhasRN = new CampanhasRN();
		this.listaCampanhas = campanhasRN.listar();
	}

	public void atualizar() {
		CampanhasRN campanhasRN = new CampanhasRN();
		campanhasRN.atualizar(this.campanhas);
	}

	public void onEditRow(RowEditEvent event) {   
	      try {   
	      Campanhas campanha = (Campanhas) event.getObject();                   
	      CampanhasRN campanhasRN = new CampanhasRN();
	      campanhasRN.atualizar(campanha);
	      this.populaLista();
	      } catch (Exception e) {   
	          //Mensagens...   
	      }
	      }	public Campanhas getCampanhas() {
	        	return this.campanhas;
	}

	public void setCampanhas(Campanhas campanhas) {
		this.campanhas = campanhas;
	}

	public List<Campanhas> getListaCampanhas() {
		return listaCampanhas;
	}

	public void setListaCampanhas(List<Campanhas> listaCampanhas) {
		this.listaCampanhas = listaCampanhas;
	}

}
CampanhasDAOHibernate:
package br.com.recuperacao.dao;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

import br.com.recuperacao.model.Campanhas;

public class CampanhasDAOHibernate implements CampanhasDAO {
	
	private Session session;
	public void setSession(Session session){
		this.session = session;
	}
	
	public void salvar(Campanhas campanhas) {
		this.session.beginTransaction();
		this.session.save(campanhas);
		session.getTransaction().commit();  

	}

	@Override
	public void atualizar(Campanhas campanhas) {
		this.session.beginTransaction();
		this.session.update(campanhas);
		session.getTransaction().commit();  

		
	}

	@Override
	public void excluir(Campanhas campanhas) {
		this.session.beginTransaction();
		this.session.delete(campanhas);
		session.getTransaction().commit();  

		
	}

	@Override
	public Campanhas buscaPorSigla(String sigla) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<Campanhas> listar() {
		this.session.beginTransaction();
		String hql = "SELECT c FROM Campanhas c";
		Query consulta = this.session.createQuery(hql);
		return (List<Campanhas>) consulta.list();
		
	}
	

}
Campanhas:
package br.com.recuperacao.model;


/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/


import java.io.Serializable;
import java.util.Collection;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;

/**
*
* @author tokumoto
*/
@Entity	
@Table(name = "campanhas")
public class Campanhas implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "idcampanhas")
private Integer idcampanhas;
@Column(name = "sigla")
private String sigla;
@Column(name = "descricao")
private String descricao;
@OneToMany
private Collection<Contato> contatoCollection;
@OneToMany
private Collection<EdicoesDevolvidas> edicoesdevolvidasCollection;

public Campanhas() {
}

public Campanhas(Integer idcampanhas) {
this.idcampanhas = idcampanhas;
}

public Integer getIdcampanhas() {
return idcampanhas;
}

public void setIdcampanhas(Integer idcampanhas) {
this.idcampanhas = idcampanhas;
}

public String getSigla() {
return sigla;
}

public void setSigla(String sigla) {
this.sigla = sigla;
}

public String getDescricao() {
return descricao;
}

public void setDescricao(String descricao) {
this.descricao = descricao;
}

public Collection<Contato> getContatoCollection() {
return contatoCollection;
}

public void setContatoCollection(Collection<Contato> contatoCollection) {
this.contatoCollection = contatoCollection;
}

public Collection<EdicoesDevolvidas> getEdicoesdevolvidasCollection() {
return edicoesdevolvidasCollection;
}

public void setEdicoesDevolvidasCollection(Collection<EdicoesDevolvidas> edicoesdevolvidasCollection) {
this.edicoesdevolvidasCollection = edicoesdevolvidasCollection;
}

@Override
public int hashCode() {
int hash = 0;
hash += (idcampanhas != null ? idcampanhas.hashCode() : 0);
return hash;
}

@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Campanhas)) {
return false;
}
Campanhas other = (Campanhas) object;
if ((this.idcampanhas == null && other.idcampanhas != null) || (this.idcampanhas != null && !this.idcampanhas.equals(other.idcampanhas))) {
return false;
}
return true;
}

@Override
public String toString() {
return "javaapplication1.Campanhas[idcampanhas=" + idcampanhas + "]";
}

}
campanhas.xhtml
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!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:p="http://primefaces.org/ui">

<h:head>
	<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
	<title>Cadastro de Campanhas</title>
</h:head>
<h:body>
	<h1>Cadastro de Campanhas</h1>
	<hr />

	<h:form id="campanhas">
		<h:messages />

		<h:outputLabel value="Sigla" for="sigla" />
		<h:inputText id="sigla" label="Sigla"
			value="#{campanhasBean.campanhas.sigla}" size="30" maxlength="30"
			required="true" requiredMessage="Insira a sigla.">
			<f:validateLength minimum="3" maximum="3" />
		</h:inputText>

		<h:outputLabel value="Descrição" for="descricao" />
		<h:inputText id="descricao" label="Descrição"
			value="#{campanhasBean.campanhas.descricao}" size="10"
			maxlength="100" required="true">
		</h:inputText>
		<h:commandButton action="#{campanhasBean.salvar}" value="Salvar" />

		<p:growl id="messages" showDetail="true" />

		<p:dataTable var="campanhas" value="#{campanhasBean.listaCampanhas}"
			id="campanhasList" editable="true">

			<p:ajax event="rowEdit" update="@this" listener="#{campanhasBean.onEditRow}"></p:ajax>
			<f:facet name="header">
            Campanhas
        </f:facet>

			<p:column headerText="Sigla" style="width:125px">
				<p:cellEditor>
					<f:facet name="output">
						<h:outputText value="#{campanhas.sigla}" />
					</f:facet>
					<f:facet name="input">
						<p:inputText value="#{campanhas.sigla}" style="width:100%" />
					</f:facet>
				</p:cellEditor>
			</p:column>
			<p:column headerText="Descrição" style="width:125px">
				<p:cellEditor>
					<f:facet name="output">
						<h:outputText value="#{campanhas.descricao}" />
					</f:facet>
					<f:facet name="input">
						<p:inputText value="#{campanhas.descricao}" style="width:100%"
							label="Year" />
					</f:facet>
				</p:cellEditor>
			</p:column>
			<p:column headerText="Options" style="width:50px ">

				<p:rowEditor />
			</p:column>
			<p:ajax event="rowEdit" listener="#{campanhasBean.atualizar}"
				update="@this" />

		</p:dataTable>

	</h:form>
	<hr />
</h:body>
</html>

Alguém consegue me ajudar?

Obrigado!

4 Respostas

Hebert_Coelho

Felipe, bem vindo ao guj.

  1. URGENTE, HEEEEEEEEEEEEELP ou qualquer coisa do tipo, não vai comover ninguém. E sério, afasta pessoas.
  2. Você colocou um monte de código, isso desanima a ler.
  3. org.hibernate.TransientObjectException: The given object has a null identifier: br.com.recuperacao.model.Campanhas Em cima desse erro, você leu? Entendeu o que ele falou em contigo? Eu tentei entender seu xhtml mas não consegui. Deve ser por que está tarde. Mas pense o seguinte, antes de atualizar o objeto que você quer, ele está null ou não? Se sim, você passou os valores necessários?
Diego_Adriano

Cara, ele não esta atualizando pelo simples fato do Objeto estar Null, tenta aumentar o Escopo para View …

drsmachado

Para quê isso?
É só instanciar um objeto de DataModel com as campanhas e, usá-lo como value para a dataTable.
Não manjo de primefaces, mas sei que isso resolve quando preciso fazer edição em objetos em uma dataTable do mojarra.

A

Muda o seu @RequestScoped para @SessionScoped.

Eu estava com este problema também. O objeto estava trazendo para a tela id populado mas na hora de atualizar ele salva no banco certo e depois mostrava esta mensagem de erro.

Abs

Criado 5 de setembro de 2012
Ultima resposta 26 de abr. de 2013
Respostas 4
Participantes 5