Erro ao tentar Fechar Venda: detached entity passed to persist[RESOLVIDO]

Bem galera, estou com um erro estranho. No momento que tento Persistir minha venda recebo esse erro, com referência a Classe Usuário:

Erro Permissão Fecha NF: org.hibernate.PersistentObjectException: detached entity passed to persist: br.com.duxsolutions.model.Usuario[code]

Porém, a única coisa que faço com o Usuário aqui nesse ponto é seta-lo na Saída para monitorar quem efetuou a venda …

[code]AtualizaMovimento am = new AtualizaMovimento();
getSaida().setMovimentos(am.atualiza(saida));

EstoqueRepository er = new EstoqueRepository(getEntityManager());
er.atualizaSaida(getDadosVenda(), getUsuarioSessao());

getSaida().setContasaReceber(getContasaReceber());

SaidaRepository sr = new SaidaRepository(getEntityManager());

getSaida().setSituacao(“F”);
saida.setDataFechamento(new Date());
saida.setHoraFechamento(new Date());
saida.setUsuarioFechamento(getUsuarioSessao());

sr.salvar(saida);[/code]
Classe Saida

public class Saida implements Serializable { @ManyToOne @JoinColumn(name="usuarioFechamento") private Usuario usuarioFechamento;
Classe Usuário

[code]public class Usuario implements Serializable{

private static final long serialVersionUID = 5465615454325030138L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer   id;
private String nome;
private String usuario;
private String senha;
private String situacao;
private boolean logado;
private String theme;

/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
//						MONITORAMENTO
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

@Temporal(TemporalType.DATE)
private Date ultimoAcesso;
@Temporal(TemporalType.TIME)
private Date horaUltimoAcesso;
@Temporal(TemporalType.DATE)
private Date data_Cadastro;
@Temporal(TemporalType.TIME)
private Date hora_Cadastro;
@Temporal(TemporalType.DATE)
private Date data_Alteracao;
@Temporal(TemporalType.TIME)
private Date hora_Alteracao;

/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
//				RELACIONAMENTOS MANY TO ONE
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

@ManyToOne
@JoinColumn(name="grupoUsuario")
private GrupoUsuario grupoUsuario;

/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
//				RELACIONAMENTOS ONE TO ONE
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

@OneToOne
@JoinColumn(name="funcionario")
private Funcionario funcionario;[/code]

E todo o Erro:

Erro Permissão Fecha NF: org.hibernate.PersistentObjectException: detached entity passed to persist: br.com.duxsolutions.model.UsuarioNov 27, 2013 5:11:37 PM com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException Grave: Error Rendering View[/pages/saida/venda.xhtml] javax.el.ELException: /pages/saida/venda.xhtml @601,47 value="#{vendaPlanosBean.saidas}": Error reading 'saidas' on type br.com.duxsolutions.bean.VendaPlanosBean at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:114) at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194) at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182) at javax.faces.component.UIData.getValue(UIData.java:731) at org.primefaces.component.datatable.DataTable.getValue(DataTable.java:867) at org.primefaces.component.api.UIData.getDataModel(UIData.java:579) at javax.faces.component.UIData.getRowCount(UIData.java:356) at org.primefaces.component.api.UIData.calculateFirst(UIData.java:157) at org.primefaces.component.datatable.DataTableRenderer.encodeMarkup(DataTableRenderer.java:176) at org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:82) at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1763) at javax.faces.render.Renderer.encodeChildren(Renderer.java:168) at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845) at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:59) at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:47) at org.primefaces.component.dialog.DialogRenderer.encodeContent(DialogRenderer.java:172) at org.primefaces.component.dialog.DialogRenderer.encodeMarkup(DialogRenderer.java:101) at org.primefaces.component.dialog.DialogRenderer.encodeEnd(DialogRenderer.java:43) at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1763) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759) at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:401) at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131) at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at br.com.duxsolutions.filter.ControleFiltro.doFilter(ControleFiltro.java:33) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: br.com.duxsolutions.model.Usuario at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1179) at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1112) at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:245) at br.com.duxsolutions.repository.SaidaRepository.saidaAll(SaidaRepository.java:39) at br.com.duxsolutions.bean.VendaPlanosBean.getSaidas(VendaPlanosBean.java:1603) 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 javax.el.BeanELResolver.getValue(BeanELResolver.java:87) at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176) at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203) at org.apache.el.parser.AstValue.getValue(AstValue.java:183) at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:185) at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109) ... 50 more Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: br.com.duxsolutions.model.Usuario at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:127) at org.hibernate.impl.SessionImpl.firePersistOnFlush(SessionImpl.java:826) at org.hibernate.impl.SessionImpl.persistOnFlush(SessionImpl.java:818) at org.hibernate.engine.CascadingAction$9.cascade(CascadingAction.java:357) at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:392) at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:335) at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204) at org.hibernate.engine.Cascade.cascade(Cascade.java:161) at org.hibernate.event.def.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventListener.java:451) at org.hibernate.event.def.DefaultPersistEventListener.entityIsPersistent(DefaultPersistEventListener.java:158) at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:132) at org.hibernate.impl.SessionImpl.firePersistOnFlush(SessionImpl.java:826) at org.hibernate.impl.SessionImpl.persistOnFlush(SessionImpl.java:818) at org.hibernate.engine.CascadingAction$9.cascade(CascadingAction.java:357) at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:392) at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:335) at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204) at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:425) at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:362) at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:338) at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204) at org.hibernate.engine.Cascade.cascade(Cascade.java:161) at org.hibernate.event.def.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:154) at org.hibernate.event.def.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:145) at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:88) at org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:58) at org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:1175) at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1251) at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102) at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:236) ... 62 more

Aqui explica o erro e mostra o que fazer: http://uaihebert.com/jpa-mini-livro-primeiros-passos-e-conceitos-detalhados/23/

Hebert … Se o problema é que o Usuário esta “detached”, se eu mapear dessa forma minha classe Saida:

@ManyToOne(cascade=CascadeType.PERSIST) @JoinColumn(name="usuarioFechamento") private Usuario usuarioFechamento;

Estarei dizendo que o Usuário precisa ser persistido junto a Saída ? Iria causar a Inserção de Mais um Usuário ??

Obrigado …

[quote=Diego Adriano]Hebert … Se o problema é que o Usuário esta “detached”, se eu mapear dessa forma minha classe Saida:

@ManyToOne(cascade=CascadeType.PERSIST) @JoinColumn(name="usuarioFechamento") private Usuario usuarioFechamento;

Estarei dizendo que o Usuário precisa ser persistido junto a Saída ? Iria causar a Inserção de Mais um Usuário ??

Obrigado …[/quote]Lá no post explica o que acontece. Se esse cara é um cara novo, ele também será persistido. Se esse cara já existe no DB o cascade não ajudará, você precisa deixá-lo attached antes de relacioná-los.

Sim, explica sim … Apenas fiquei com essa duvida …
Aliás … Otimo livro … Parabéns !!

[quote=Diego Adriano]Sim, explica sim … Apenas fiquei com essa duvida …
Aliás … Otimo livro … Parabéns !![/quote]Valeu. [=

Bem … fiz da seguinte forma a inserção do Usuário na venda …

Agora esta com erro em outro ponto …
Mas nada haver com isso aqui !!

Obrigado Hebbert

Abraços …

Voltei a ter o mesmo erro !!!
Mas o código continua o mesmo !!

Pois bem, fiz o seguinte teste:

[code]System.out.println("Usuario A: "+getEntityManager().contains(saida.getUsuarioFechamento()));

saida.setUsuarioFechamento(ur.usuarioPorId(getEntityManager().getReference(Usuario.class, getUsuarioSessao().getId())));

System.out.println("Usuario D: "+getEntityManager().contains(saida.getUsuarioFechamento()));[/code]

E tive o seguinte resultado:

Usuario A: false Usuario D: true

Ele mudou o Estado do Objeto, agora pq continua com o mesmo erro ?

Meu caro amigo !

O que vc pretende fazer com isso ???

Talvez podemos fazer outro caminho :smiley:

Opa … Bem, estou desenvolvendo a Rotina de venda, então para monitoramento quero saber qual Usuário efetuou a venda … Por isso pego o Usuário da Sessão e ligo ele a venda:

Estranho, pois na Entrada acontece o mesmo e funciona normalmente !

Copia a Entrada , Cola e substitui as palavras Entradas para Saidas … rsrs"

Ultilizando o atalho Cntrl + F …

Opa … vlw …rs

Bem galera … Obrigado novamente pela atenção …
Realmente o problema era que haviam “Usuários” dettacheds …
Pois bem, analisando toda a estrutura lembrei que minha lista de Contas a Receber tb recebia um Usuario, batata, testei e estava attached, mudei o estado e fiz o mesmo com a lista de Movimentação do Estoque e funcionou …

Obrigado !!!