[RESOLVIDO]Erro ao persistir um objeto no banco de dados com spring

Olá pessoal!

Estou desenvolvendo uma aplicaççao usando spring ioc para injeção de dependencia e inversão juntamente com JSF2, mas está acontecendo um problema, ao persistri meu boleltim da o seguinte erro:


29/05/2012 12:12:50 com.sun.faces.application.ActionListenerImpl processAction
GRAVE: org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist: br.com.estub.boletim.modelo.Boletim; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: br.com.estub.boletim.modelo.Boletim
javax.faces.el.EvaluationException: org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist: br.com.estub.boletim.modelo.Boletim; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: 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: detached entity passed to persist: br.com.estub.boletim.modelo.Boletim; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: br.com.estub.boletim.modelo.Boletim
	at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:651)
	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.persist(HibernateTemplate.java:793)
	at br.com.estub.boletim.dao.BoletimDAO.salvar(BoletimDAO.java:53)
	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:38)
	at br.com.estub.boletim.mb.BoletimMB.acaoSalvar(BoletimMB.java:79)
	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.PersistentObjectException: detached entity passed to persist: br.com.estub.boletim.modelo.Boletim
	at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:127)
	at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:61)
	at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:800)
	at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:774)
	at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:778)
	at org.springframework.orm.hibernate3.HibernateTemplate$21.doInHibernate(HibernateTemplate.java:796)
	at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406)
	... 51 more
29/05/2012 12:12:50 com.sun.faces.lifecycle.InvokeApplicationPhase execute
AVISO: #{boletimMB.acaoSalvar}: org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist: br.com.estub.boletim.modelo.Boletim; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: br.com.estub.boletim.modelo.Boletim
javax.faces.FacesException: #{boletimMB.acaoSalvar}: org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist: br.com.estub.boletim.modelo.Boletim; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: 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: detached entity passed to persist: br.com.estub.boletim.modelo.Boletim; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: 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: detached entity passed to persist: br.com.estub.boletim.modelo.Boletim; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: br.com.estub.boletim.modelo.Boletim
	at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:651)
	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.persist(HibernateTemplate.java:793)
	at br.com.estub.boletim.dao.BoletimDAO.salvar(BoletimDAO.java:53)
	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:38)
	at br.com.estub.boletim.mb.BoletimMB.acaoSalvar(BoletimMB.java:79)
	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.PersistentObjectException: detached entity passed to persist: br.com.estub.boletim.modelo.Boletim
	at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:127)
	at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:61)
	at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:800)
	at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:774)
	at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:778)
	at org.springframework.orm.hibernate3.HibernateTemplate$21.doInHibernate(HibernateTemplate.java:796)
	at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406)
	... 51 more
javax.faces.FacesException: #{boletimMB.acaoSalvar}: org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist: br.com.estub.boletim.modelo.Boletim; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: 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: detached entity passed to persist: br.com.estub.boletim.modelo.Boletim; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: 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: detached entity passed to persist: br.com.estub.boletim.modelo.Boletim; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: 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: detached entity passed to persist: br.com.estub.boletim.modelo.Boletim; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: br.com.estub.boletim.modelo.Boletim
	at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:651)
	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.persist(HibernateTemplate.java:793)
	at br.com.estub.boletim.dao.BoletimDAO.salvar(BoletimDAO.java:53)
	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:38)
	at br.com.estub.boletim.mb.BoletimMB.acaoSalvar(BoletimMB.java:79)
	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.PersistentObjectException: detached entity passed to persist: br.com.estub.boletim.modelo.Boletim
	at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:127)
	at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:61)
	at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:800)
	at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:774)
	at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:778)
	at org.springframework.orm.hibernate3.HibernateTemplate$21.doInHibernate(HibernateTemplate.java:796)
	at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406)
	... 51 more

Ele diz que meu objeto esta detached, mas não entendo pois o spring trata isso pra mim, se não tivesse usando um framework que cuidasse da minha transação tudo bem teria que dar um commit e tudo mais. Outra coisa eu cheguei a executar a aplicação algumas vezes e deu certo, mas agora está dando esse erro o pior que não mexi em nada.

Segue minhas classes:


package br.com.estub.boletim.modelo;

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

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

@Entity
public class Contrato implements Serializable {

	
	@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.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.validation.Valid;

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

	@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;
	}

}

DAO


package br.com.estub.boletim.dao;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

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

@Repository("boletimDao")
@Transactional(readOnly = false)
public class BoletimDAO implements Serializable, IDAO<Boletim> {

	private static final long serialVersionUID = 1L;

	private HibernateTemplate template;

	@Autowired
	public BoletimDAO(HibernateTemplate hibernateTemplate) {
		this.template = hibernateTemplate;

	}

	@Override
	public void alterar(Boletim t) {
		this.template.update(t);

	}

	@Override
	public Boletim buscarPorId(Long id) {

		return (Boletim) this.template.get(Boletim.class, id);
	}

	@Override
	public List<Boletim> listar() {
		List<Boletim> boletins = this.template.find("from Boletim");
		return boletins;
	}

	@Override
	public void remover(Boletim t) {
		this.template.delete(t);

	}

	@Override
	public void salvar(Boletim t) {
		this.template.persist(t);
	}

}

Serviço


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{

	@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);
	}

}

Managed Bean


package br.com.estub.boletim.mb;

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

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

import br.com.estub.boletim.modelo.Boletim;
import br.com.estub.boletim.modelo.Contrato;
import br.com.estub.boletim.modelo.ItemBoletim;
import br.com.estub.boletim.service.BoletimService;
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;


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

	public BoletimService getModelo() {
		return modelo;
	}

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

	
	public Boletim getBoletim() {
		return boletim;
	}

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

	public List<Boletim> getBoletins() {
		
		if (this.boletins == null){
			this.boletins = modelo.listaTodos();
		}
		return this.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.modelo.salvar(this.boletim);

		this.setBoletim(new Boletim());
	
		return "boletimListar.xhtml";
	}

	public void alterar() {

		this.modelo.altera(boletim);
	}

		
	public void guardaItem() {

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

		this.item = new ItemBoletim();

	}
	
	public void acaoExcluirItem(){
		Long id = JSFUtil.getParametroLong("itemId");
		this.boletim.getItens().remove(id);
	}

	public String acaoAbrirAlteracao() {

		 Long id = JSFUtil.getParametroLong("boletimId");
		 Boletim objetoDoBanco = this.modelo.getBuscaPorId(id);
		 this.setBoletim(objetoDoBanco);

		return "boletim";
	}
	
	public void limpaFormulario(){
		
		this.setBoletim(new Boletim());
		this.setContrato(new Contrato());
		this.setItem(new ItemBoletim());
	}

}

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">Cadastra Boletim de Caixa</ui:define>
	<ui:define name="conteudo">
	
	<h2></h2>
	 	
	<h:form id="formulario">
		<h:inputHidden id="idUsuario" value="#{boletimMB.boletim.id}" />
		<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="Guarda Item"></p:commandButton>
					</h:panelGroup>
				</f:facet>
	
		</h:panelGrid>
</p:fieldset>
</h:form>
		
		<p:dataTable value="#{boletimMB.boletim.itens}" var="item" widgetVar="carsTable" paginator="true" rows="3"  rowsPerPageTemplate="5,10,15"
				selectionMode="single">
			<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="#{boletimMB.acaoExcluirItem}" 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">
								<!-- <f:ajax execute=":formulario" render=":formulario :formulario:formularioItem"></f:ajax> -->
						</p:commandButton>
					</h:panelGroup>
				</f:facet>
			
		</p:dataTable>
		
	</h:form>
	</ui:define>
</ui:composition>
</html>

Alguém pode me ajudar!!!

vc provavelmente está setando o ID manualmente num objeto que tem o ID marcado com @GeneratedValue,dai o erro de ‘detached entity’

1 curtida

Valeu amigo muito obrigado pela sua ajuda, era isso mesmo, eu dei um vacilo aqui e nem percebi no meu boletim.xhtml eu coloquei um campo que setava o id.

Desde já agradeço pela ajuda!!!

1 curtida