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!