Dúvida JSF + Hibernate - URGENTE!

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:

[code]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;
}

}
[/code]

CampanhasDAOHibernate:

[code]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();
	
}

}
[/code]

Campanhas:

[code]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 contatoCollection;
    @OneToMany
    private Collection 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 getContatoCollection() {
return contatoCollection;
}

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

public Collection getEdicoesdevolvidasCollection() {
return edicoesdevolvidasCollection;
}

public void setEdicoesDevolvidasCollection(Collection 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 + “]”;
}

}[/code]

campanhas.xhtml

[code]<?xml version="1.0" encoding="ISO-8859-1" ?>

<h:head>

Cadastro de Campanhas
</h:head>
<h:body>

Cadastro de Campanhas



<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>

[/code]

Alguém consegue me ajudar?

Obrigado!

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?

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

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.

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