[RESOLVIDO]Erro no Hinernate "The given object has a null identifier"

Olá pessoal!

Estou desenvolvendo uma aplicação onde estou spring e jsf2. Qundo estou tentando salvar um objetos que tem relações com outros objetos está dando o seguinte erro:


22/05/2012 09:51:39 com.sun.faces.application.ActionListenerImpl processAction
GRAVE: org.springframework.dao.InvalidDataAccessApiUsageException: The given object has a null identifier: br.com.estub.boletim.modelo.Boletim; nested exception is org.hibernate.TransientObjectException: The given object has a null identifier: br.com.estub.boletim.modelo.Boletim
javax.faces.el.EvaluationException: org.springframework.dao.InvalidDataAccessApiUsageException: The given object has a null identifier: br.com.estub.boletim.modelo.Boletim; nested exception is org.hibernate.TransientObjectException: The given object has a null identifier: br.com.estub.boletim.modelo.Boletim
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:98)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:98)
	at javax.faces.component.UICommand.broadcast(UICommand.java:311)
	at javax.faces.component.UIData.broadcast(UIData.java:912)
	at org.primefaces.component.datatable.DataTable.broadcast(DataTable.java:630)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:781)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1246)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:77)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:308)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: The given object has a null identifier: br.com.estub.boletim.modelo.Boletim; nested exception is org.hibernate.TransientObjectException: The given object has a null identifier: br.com.estub.boletim.modelo.Boletim
	at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:654)
	at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
	at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411)
	at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
	at org.springframework.orm.hibernate3.HibernateTemplate.update(HibernateTemplate.java:705)
	at org.springframework.orm.hibernate3.HibernateTemplate.update(HibernateTemplate.java:701)
	at br.com.estub.boletim.dao.BoletimDAO.salvar(BoletimDAO.java:51)
	at br.com.estub.boletim.dao.BoletimDAO.salvar(BoletimDAO.java:1)
	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.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
	at $Proxy23.salvar(Unknown Source)
	at br.com.estub.boletim.service.BoletimService.salvar(BoletimService.java:40)
	at br.com.estub.boletim.mb.BoletimMB.acaoSalvar(BoletimMB.java:92)
	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:262)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:102)
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:84)
	... 26 more
Caused by: org.hibernate.TransientObjectException: The given object has a null identifier: br.com.estub.boletim.modelo.Boletim
	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:734)
	at org.hibernate.impl.SessionImpl.update(SessionImpl.java:722)
	at org.hibernate.impl.SessionImpl.update(SessionImpl.java:714)
	at org.springframework.orm.hibernate3.HibernateTemplate$14.doInHibernate(HibernateTemplate.java:708)
	at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406)
	... 52 more
22/05/2012 09:51:39 com.sun.faces.lifecycle.InvokeApplicationPhase execute
AVISO: #{boletimMB.acaoSalvar}: org.springframework.dao.InvalidDataAccessApiUsageException: The given object has a null identifier: br.com.estub.boletim.modelo.Boletim; nested exception is org.hibernate.TransientObjectException: The given object has a null identifier: br.com.estub.boletim.modelo.Boletim
javax.faces.FacesException: #{boletimMB.acaoSalvar}: org.springframework.dao.InvalidDataAccessApiUsageException: The given object has a null identifier: br.com.estub.boletim.modelo.Boletim; nested exception is org.hibernate.TransientObjectException: The given object has a null identifier: br.com.estub.boletim.modelo.Boletim
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:114)
	at javax.faces.component.UICommand.broadcast(UICommand.java:311)
	at javax.faces.component.UIData.broadcast(UIData.java:912)
	at org.primefaces.component.datatable.DataTable.broadcast(DataTable.java:630)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:781)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1246)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:77)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:308)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: javax.faces.el.EvaluationException: org.springframework.dao.InvalidDataAccessApiUsageException: The given object has a null identifier: br.com.estub.boletim.modelo.Boletim; nested exception is org.hibernate.TransientObjectException: The given object has a null identifier: br.com.estub.boletim.modelo.Boletim
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:98)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:98)
	... 25 more
Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: The given object has a null identifier: br.com.estub.boletim.modelo.Boletim; nested exception is org.hibernate.TransientObjectException: The given object has a null identifier: br.com.estub.boletim.modelo.Boletim
	at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:654)
	at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
	at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411)
	at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
	at org.springframework.orm.hibernate3.HibernateTemplate.update(HibernateTemplate.java:705)
	at org.springframework.orm.hibernate3.HibernateTemplate.update(HibernateTemplate.java:701)
	at br.com.estub.boletim.dao.BoletimDAO.salvar(BoletimDAO.java:51)
	at br.com.estub.boletim.dao.BoletimDAO.salvar(BoletimDAO.java:1)
	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.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
	at $Proxy23.salvar(Unknown Source)
	at br.com.estub.boletim.service.BoletimService.salvar(BoletimService.java:40)
	at br.com.estub.boletim.mb.BoletimMB.acaoSalvar(BoletimMB.java:92)
	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:262)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:102)
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:84)
	... 26 more
Caused by: org.hibernate.TransientObjectException: The given object has a null identifier: br.com.estub.boletim.modelo.Boletim
	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:734)
	at org.hibernate.impl.SessionImpl.update(SessionImpl.java:722)
	at org.hibernate.impl.SessionImpl.update(SessionImpl.java:714)
	at org.springframework.orm.hibernate3.HibernateTemplate$14.doInHibernate(HibernateTemplate.java:708)
	at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406)
	... 52 more
javax.faces.FacesException: #{boletimMB.acaoSalvar}: org.springframework.dao.InvalidDataAccessApiUsageException: The given object has a null identifier: br.com.estub.boletim.modelo.Boletim; nested exception is org.hibernate.TransientObjectException: The given object has a null identifier: br.com.estub.boletim.modelo.Boletim
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:85)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:308)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: javax.faces.FacesException: #{boletimMB.acaoSalvar}: org.springframework.dao.InvalidDataAccessApiUsageException: The given object has a null identifier: br.com.estub.boletim.modelo.Boletim; nested exception is org.hibernate.TransientObjectException: The given object has a null identifier: br.com.estub.boletim.modelo.Boletim
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:114)
	at javax.faces.component.UICommand.broadcast(UICommand.java:311)
	at javax.faces.component.UIData.broadcast(UIData.java:912)
	at org.primefaces.component.datatable.DataTable.broadcast(DataTable.java:630)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:781)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1246)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:77)
	... 19 more
Caused by: javax.faces.el.EvaluationException: org.springframework.dao.InvalidDataAccessApiUsageException: The given object has a null identifier: br.com.estub.boletim.modelo.Boletim; nested exception is org.hibernate.TransientObjectException: The given object has a null identifier: br.com.estub.boletim.modelo.Boletim
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:98)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:98)
	... 25 more
Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: The given object has a null identifier: br.com.estub.boletim.modelo.Boletim; nested exception is org.hibernate.TransientObjectException: The given object has a null identifier: br.com.estub.boletim.modelo.Boletim
	at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:654)
	at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
	at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411)
	at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
	at org.springframework.orm.hibernate3.HibernateTemplate.update(HibernateTemplate.java:705)
	at org.springframework.orm.hibernate3.HibernateTemplate.update(HibernateTemplate.java:701)
	at br.com.estub.boletim.dao.BoletimDAO.salvar(BoletimDAO.java:51)
	at br.com.estub.boletim.dao.BoletimDAO.salvar(BoletimDAO.java:1)
	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.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
	at $Proxy23.salvar(Unknown Source)
	at br.com.estub.boletim.service.BoletimService.salvar(BoletimService.java:40)
	at br.com.estub.boletim.mb.BoletimMB.acaoSalvar(BoletimMB.java:92)
	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:262)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:102)
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:84)
	... 26 more
Caused by: org.hibernate.TransientObjectException: The given object has a null identifier: br.com.estub.boletim.modelo.Boletim
	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:734)
	at org.hibernate.impl.SessionImpl.update(SessionImpl.java:722)
	at org.hibernate.impl.SessionImpl.update(SessionImpl.java:714)
	at org.springframework.orm.hibernate3.HibernateTemplate$14.doInHibernate(HibernateTemplate.java:708)
	at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406)
	... 52 more

alguem pode me ajudar?

Minhas classes modelo:


package br.com.estub.boletim.modelo;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;

@Entity
public class Contrato implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue
	private Long id;

	@Column(nullable = false, length = 10)
	private String codigo;

	@OneToMany(mappedBy = "contrato")
	private List<Boletim> boletins = new ArrayList<Boletim>();

	public Long getId() {
		return id;
	}

	public String getCodigo() {
		return codigo;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	public List<Boletim> getBoletims() {
		return boletins;
	}

	public void setBoletims(List<Boletim> boletims) {
		this.boletins = boletims;
	}

}

package br.com.estub.boletim.modelo;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

@Entity
public class Boletim implements Serializable{
	
	private static final long serialVersionUID = 1L;
	
	@Id
	@GeneratedValue
	private Long id;

	@Column(nullable = false, length = 10)
	private String codigo;

	@ManyToOne(cascade=CascadeType.PERSIST)
	private Contrato contrato;

	@OneToMany(cascade=CascadeType.PERSIST, mappedBy = "boletim")
	private List<ItemBoletim> itens = new ArrayList<ItemBoletim>();

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getCodigo() {
		return codigo;
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	public List<ItemBoletim> getItens() {
		return itens;
	}

	public void setItens(List<ItemBoletim> itens) {
		this.itens = itens;
	}

	public Contrato getContrato() {
		return contrato;
	}

	public void setContrato(Contrato contrato) {
		this.contrato = contrato;
	}

}

package br.com.estub.boletim.modelo;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Calendar;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
public class ItemBoletim implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue
	private Long id;

	@Column(nullable = false)
	@Temporal(TemporalType.DATE)
	private Calendar data = Calendar.getInstance();

	private BigDecimal frete;

	private BigDecimal custoDeslocamento;

	private BigDecimal maoDeObraTercerizada;

	private BigDecimal refeicao;

	private BigDecimal hospedagem;

	private BigDecimal documentacao;

	private BigDecimal outrasDespesas;

	@ManyToOne
	private Boletim boletim;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Calendar getData() {
		return data;
	}

	public void setData(Calendar data) {
		this.data = data;
	}

	public BigDecimal getFrete() {
		return frete;
	}

	public void setFrete(BigDecimal frete) {
		this.frete = frete;
	}

	public BigDecimal getCustoDeslocamento() {
		return custoDeslocamento;
	}

	public void setCustoDeslocamento(BigDecimal custoDeslocamento) {
		this.custoDeslocamento = custoDeslocamento;
	}

	public BigDecimal getMaoDeObraTercerizada() {
		return maoDeObraTercerizada;
	}

	public void setMaoDeObraTercerizada(BigDecimal maoDeObraTercerizada) {
		this.maoDeObraTercerizada = maoDeObraTercerizada;
	}

	public BigDecimal getRefeicao() {
		return refeicao;
	}

	public void setRefeicao(BigDecimal refeicao) {
		this.refeicao = refeicao;
	}

	public BigDecimal getHospedagem() {
		return hospedagem;
	}

	public void setHospedagem(BigDecimal hospedagem) {
		this.hospedagem = hospedagem;
	}

	public BigDecimal getDocumentacao() {
		return documentacao;
	}

	public void setDocumentacao(BigDecimal documentacao) {
		this.documentacao = documentacao;
	}

	public BigDecimal getOutrasDespesas() {
		return outrasDespesas;
	}

	public void setOutrasDespesas(BigDecimal outrasDespesas) {
		this.outrasDespesas = outrasDespesas;
	}

	public Boletim getBoletim() {
		return boletim;
	}

	public void setBoletim(Boletim boletim) {
		this.boletim = boletim;
	}

}

Meu Servico


package br.com.estub.boletim.service;

import java.io.Serializable;
import java.util.List;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import br.com.estub.boletim.dao.IDAO;
import br.com.estub.boletim.modelo.Boletim;

@Service("boletimService")
public class BoletimService implements Serializable {
	
	private static final long serialVersionUID = 1L;
	
	@Qualifier("boletimDAO")
	private IDAO<Boletim> dao;

	public IDAO<Boletim> getDao() {
		return dao;
	}

	public void setDao(IDAO<Boletim> dao) {
		this.dao = dao;
	}

	public Boletim getBuscaPorId(Long id) {

		return dao.buscarPorId(id);
	}

	public List<Boletim> listaTodos() {

		return dao.listar();
	}

	public void salvar(Boletim boletim) {

		dao.salvar(boletim);
	}

	public void remover(Boletim boletim) {

		dao.remover(boletim);
	}

	public void altera(Boletim boletim) {

		dao.alterar(boletim);
	}

}

meu bean

package br.com.estub.boletim.mb;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import javax.faces.bean.ViewScoped;

import org.apache.log4j.chainsaw.Main;

import br.com.estub.boletim.modelo.Boletim;
import br.com.estub.boletim.modelo.Contrato;
import br.com.estub.boletim.modelo.Filial;
import br.com.estub.boletim.modelo.ItemBoletim;
import br.com.estub.boletim.service.BoletimDeCaixaService;
import br.com.estub.boletim.service.BoletimService;
import br.com.estub.boletim.service.FilialService;
import br.com.estub.boletim.util.JSFUtil;

@ManagedBean(name = "boletimMB")
@ViewScoped
public class BoletimMB implements Serializable {

	private static final long serialVersionUID = 1L;

	@ManagedProperty("#{boletimService}")
	private BoletimService modelo;

	@ManagedProperty("#{boletimDeCaixaService}")
	private BoletimDeCaixaService modelo1;

	private Boletim boletim = new Boletim();
	private List<Boletim> boletins;
	private ItemBoletim item = new ItemBoletim();
	private Contrato contrato = new Contrato();

	public BoletimService getModelo() {
		return modelo;
	}

	public void setModelo(BoletimService modelo) {
		this.modelo = modelo;
	}

	public BoletimDeCaixaService getModelo1() {
		return modelo1;
	}

	public void setModelo1(BoletimDeCaixaService modelo1) {
		this.modelo1 = modelo1;
	}

	public Boletim getBoletim() {
		return boletim;
	}

	public void setBoletim(Boletim boletim) {
		this.boletim = boletim;
	}

	public List<Boletim> getBoletins() {
		return boletins;
	}

	public void setBoletins(List<Boletim> boletins) {
		this.boletins = boletins;
	}

	public ItemBoletim getItem() {
		return item;
	}

	public void setItem(ItemBoletim item) {
		this.item = item;
	}

	public Contrato getContrato() {
		return contrato;
	}

	public void setContrato(Contrato contrato) {
		this.contrato = contrato;
	}

	public String acaoSalvar() {
		System.out.println("*****SALVANDO BOLETIM*****");
		///this.boletim.setContrato(contrato);
		this.modelo1.salvar(contrato);
		this.modelo.salvar(this.boletim);

		this.boletim = new Boletim();

		return "boletimListar";
	}

	public void alterar() {

		this.modelo.altera(boletim);
	}

	public String acaoCancelar() {
		// limpar o objeto da página
		this.setBoletim(new Boletim());

		return "boletim";
	}

	public void guardaItem() {

		//this.boletim.setContrato(contrato);
		this.item.setBoletim(boletim);
		this.boletim.getItens().add(this.item);

		this.item = new ItemBoletim();

	}

	public String acaoAbrirAlteracao() {

		// int id = JSFUtil.getParametroInteger("itemId");
		// ItemBoletim objeto = this.boletim.getItens().get(id);
		// this.setItem(objeto);

		return "boletim";
	}

}

meu 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:f="http://java.sun.com/jsf/core"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:p="http://primefaces.prime.com.tr/ui">

<ui:composition template="_templete.xhtml">

<ui:define name="titulo">Boletim</ui:define>

	<ui:define name="conteudo">
	<h2>Cadastra Boletim de Caixa</h2>
	 <p:messages id="messages" />  
	
	<h:form id="formulario">

		<h:panelGrid columns="2">
		
			
			<h:outputLabel value="Contrato: " for="contrato" />
				<p:inputMask id="contrato" value="#{boletimMB.contrato.codigo}"
					mask="a*-99/9999" required="true" label="Campo Contrato" />
					

				<h:outputLabel value="Boletim: " for="boletim" />
			<p:inputText id="boletim" value="#{boletimMB.boletim.codigo}" required="true" label="Campo Boletim"/>

		</h:panelGrid>
		
		<h:form id="formularioItem">
		<p:fieldset legend="Itens do Boletim" toggleable="true">
		<h:panelGrid columns="4">
		
		<h:outputLabel value="Data: " for="data" />
		<p:calendar pattern="dd/MM/yyyy" mode="popup" showOn="button" id="data" required="true" label="Campo Data" value="#{boletimMB.item.data.time}" >
			<f:convertDateTime pattern="dd/MM/yyyy" />
		</p:calendar>
			
		

			<h:outputLabel value="Frete: " for="frete" />
			<p:inputText id="frete" value="#{boletimMB.item.frete}" />

			<h:outputLabel value="Custo de Deslocamento: " for="cust" />
			<p:inputText id="cust" value="#{boletimMB.item.custoDeslocamento}" />

			<h:outputLabel value="Mão de Obra Tercerizada: " for="maoDeObra" />
			<p:inputText id="maoDeObra" value="#{boletimMB.item.maoDeObraTercerizada}" />

			<h:outputLabel value="Refeição: " for="ref" />
			<p:inputText id="ref" value="#{boletimMB.item.refeicao}" />

			<h:outputLabel value="Hospedagem: " for="hosp" />
			<p:inputText id="hosp" value="#{boletimMB.item.hospedagem}"/>

			<h:outputLabel value="Documentação: " for="doc" />
			<p:inputText id="doc" value="#{boletimMB.item.documentacao}" />

			<h:outputLabel value="Outras Despesas: " for="outras" />
			<p:inputText id="outras" value="#{boletimMB.item.outrasDespesas}"/>
			
			<f:facet name="footer">
					<h:panelGroup layout="block" style="text-align: center">
						<p:commandButton ajax="false" action="#{boletimMB.guardaItem}" id="btnIncluir" value="Incluir">
								<f:ajax execute=":formulario" render=":formulario :formulario:formTabela"></f:ajax>
												</p:commandButton>
						<p:commandButton ajax="false" id="btnCancelar" 
							immediate="true" value="Cancelar"></p:commandButton>
					</h:panelGroup>
				</f:facet>
	
		</h:panelGrid>
</p:fieldset>
</h:form>
		<!--  <h:form id="formTabela"> -->
		<p:dataTable value="#{boletimMB.boletim.itens}" var="item" widgetVar="carsTable">
			<f:facet name="header">
				Itens Boletim
			</f:facet>
			<p:column>
				<f:facet name="header">Data</f:facet>
				<h:outputText value="#{item.data.time}"></h:outputText>
			
			</p:column>
			<p:column headerText="Frete" >
				<h:outputText value="#{item.frete}">
					<f:convertNumber type="currency" currencySymbol="R$ " locale="pt_BR"></f:convertNumber>
				</h:outputText>
			</p:column>
			
			<p:column headerText="Custo de Deslocamento" >
				<h:outputText value="#{item.custoDeslocamento}">
					<f:convertNumber type="currency" currencySymbol="R$ " locale="pt_BR"></f:convertNumber>
				</h:outputText>
			</p:column>

			
			<p:column headerText="Mão de Obra Tercerizada" >
				<h:outputText value="#{item.maoDeObraTercerizada}">
					<f:convertNumber type="currency" currencySymbol="R$ " locale="pt_BR"></f:convertNumber>
				</h:outputText>
			</p:column>

			
			<p:column headerText="refeicao" >
				<h:outputText value="#{item.refeicao}">
					<f:convertNumber type="currency" currencySymbol="R$ " locale="pt_BR"></f:convertNumber>
				</h:outputText>
			</p:column>
			
			<p:column headerText="Hospedagem" >
				<h:outputText value="#{item.hospedagem}">
					<f:convertNumber type="currency" currencySymbol="R$ " locale="pt_BR"></f:convertNumber>
				</h:outputText>
			</p:column>
			
			<p:column headerText="Documentação" >
				<h:outputText value="#{item.documentacao}">
					<f:convertNumber type="currency" currencySymbol="R$ " locale="pt_BR"></f:convertNumber>
				</h:outputText>
			</p:column>
			
			<p:column headerText="Outras Despesas" >
				<h:outputText value="#{item.outrasDespesas}">
					<f:convertNumber type="currency" currencySymbol="R$ " locale="pt_BR"></f:convertNumber>
				</h:outputText>
			</p:column>
			
			<p:column>
					<f:facet name="header">
						<h:outputText value="Ações" />
					</f:facet>
					<h:panelGroup>
						<p:commandButton ajax="false" type="push" value="Alterar"
							action="#{boletimMB.acaoAbrirAlteracao}" immediate="true"
							image="ui-icon-pencil">
							<f:param value="#{item.id}" name="itemId" />
						</p:commandButton>

						<p:commandButton type="button" value="Excluir"
							onclick="conf#{item.id}.show()" image="ui-icon-close">
						</p:commandButton>

						<p:confirmDialog message="Deseja excluir este registro?"
							showEffect="bounce" hideEffect="explode" 
							header="Confirmação de Exclusão" severity="alert"
							widgetVar="conf#{item.id}">

							<p:commandButton ajax="false" type="push" value="Sim"
								action="#{pessoaMB.acaoExcluir}" immediate="true"
								image="ui-icon-check">
								<f:param value="#{item.id}" name="itemId" />
							</p:commandButton>

							<p:commandButton value="Não" onclick="conf#{item.id}.hide()"
								type="button" image="ui-icon-close" />
						</p:confirmDialog>
					</h:panelGroup>
				</p:column>
			
			<f:facet name="footer">
					<h:panelGroup layout="block" style="text-align: center">
						<p:commandButton action="#{boletimMB.acaoSalvar}" value="Salvar"></p:commandButton>
						<p:commandButton  id="btnCancelar" immediate="true" value="Cancelar"></p:commandButton>
					</h:panelGroup>
				</f:facet>
			
		</p:dataTable>
		<!-- </h:form> -->
	</h:form>
	</ui:define>
</ui:composition>
</html>

Pelo que eu entendi tem alguma coisa no meu objeto que está null, vendo isso coloquei um break point para ver o que esta acontecendo, mas o único atributo que está null é o ID, pois o hibernate se encarrega de gerá-lo automaticamente.

pode ser tanto um dos seus relacionamentos quanto seu objeto principal.

você ja conseguiu cadastrar essa entidade antes?

Não, estou desenvolvendo a aplicação agora!

e como está sendo gerado pra você? você criou uma sequence? o banco que você usa tem sequence?

No método salvar chame o método persist ao invés de update.

Ele está tentando fazer um update e daí como não tem identificador dá o erro especificado.

Você pode substituir o salvar e atualizar pelo método saveOrUpdate, ele faz essa chacagem.
Se tem id ele salva, senão faz update.

Na verdade não uso a sequnece, pois estou usando o MySQL ele gera o id automaticamente.

Olá pessoal consegui resolver o problema muito obrigado a todos.

me orientaram a trocar na metodo save o update por persist.