Boa tarde pessoal.
Estou com problema ao utilizar JPA para o seguinte caso.
Tenho quatro tabelas relacionadas, todas um para muitos (1ª um para muitos 2ª, 2ª um para muitos 3ª, etc). Em determinado momento tenho que atualizar um registro da 1ª tabela e deletar os registros referentes a este primeiro nas demais tabelas.
O mapeamento entre elas está assim:
1ª tabela:
...
@Id
@Basic(optional = false)
@Column(name = "ID_SAIDA", nullable = false)
@GeneratedValue(generator = "saida", strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name = "saida", sequenceName = "CLT.AA_SAIDA_COO_S", initialValue = 1, allocationSize = 1)
private Long idSaida;
...
@OneToMany(cascade = CascadeType.ALL, mappedBy = "idSaida")
private List<SaidaLote> saidaLoteList;
...
2ª tabela:
...
@Id
@Basic(optional = false)
@Column(name = "ID_SAIDALOTE", nullable = false)
@GeneratedValue(generator = "saidalote", strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name = "saidalote", sequenceName = "CLT.AA_SAIDALOTE_COO_S", initialValue = 1, allocationSize = 1)
private Long idSaidaLote;
...
//referente à 3ª tabela
@OneToMany(cascade = CascadeType.ALL, mappedBy = "idSaidalote")
private List<SaidaPega> saidaPegaList;
//referente à 1ª tabela
@JoinColumn(name = "ID_SAIDA", referencedColumnName = "ID_SAIDA", nullable = false)
@ManyToOne(optional = false)
private Saida idSaida;
...
O código que executa a tarefa que eu disse acima é este:
//em caso de erro
em.getTransaction().begin();
saida.setInSituacao("P");
saidaDao.update(saida);
saidaDao.commit();
em.getTransaction().begin();
Dao<SaidaLote> saidaLoteDao = new Dao<SaidaLote>(SaidaLote.class, em);
saidaLoteDao.load(saidaLote, saidaLote.getIdSaidaLote());
saidaLoteDao.delete(saidaLote);
saidaLoteDao.commit(); //linha que dá o erro
E o erro gerado por esse código:
javax.persistence.RollbackException: Error while commiting the transaction
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:71)
at br.com.cooxupe.armazem.bd.Dao.commit(Dao.java:41)
at br.com.cooxupe.armazem.webservice.SaidaImpl.salvarSaida(SaidaImpl.java:453)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.codehaus.xfire.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:59)
at org.codehaus.xfire.service.invoker.ObjectInvoker.invoke(ObjectInvoker.java:45)
at org.codehaus.xfire.service.binding.ServiceInvocationHandler.sendMessage(ServiceInvocationHandler.java:320)
at org.codehaus.xfire.service.binding.ServiceInvocationHandler$1.run(ServiceInvocationHandler.java:86)
at org.codehaus.xfire.service.binding.ServiceInvocationHandler.execute(ServiceInvocationHandler.java:134)
at org.codehaus.xfire.service.binding.ServiceInvocationHandler.invoke(ServiceInvocationHandler.java:109)
at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
at org.codehaus.xfire.transport.DefaultEndpoint.onReceive(DefaultEndpoint.java:64)
at org.codehaus.xfire.transport.AbstractChannel.receive(AbstractChannel.java:38)
at org.codehaus.xfire.transport.http.XFireServletController.invoke(XFireServletController.java:304)
at org.codehaus.xfire.transport.http.XFireServletController.doService(XFireServletController.java:129)
at org.codehaus.xfire.transport.http.XFireServlet.doPost(XFireServlet.java:116)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
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:128)
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:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
at java.lang.Thread.run(Thread.java:619)
Caused by: org.hibernate.ObjectDeletedException: deleted entity passed to persist: [br.com.cooxupe.pojo.SaidaLote#<null>]
at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:90)
at org.hibernate.impl.SessionImpl.firePersistOnFlush(SessionImpl.java:644)
at org.hibernate.impl.SessionImpl.persistOnFlush(SessionImpl.java:636)
at org.hibernate.engine.CascadingAction$9.cascade(CascadingAction.java:323)
at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:268)
at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:216)
at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:296)
at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:242)
at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:219)
at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
at org.hibernate.engine.Cascade.cascade(Cascade.java:130)
at org.hibernate.event.def.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:131)
at org.hibernate.event.def.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:122)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:65)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:54)
... 32 more
Já procurei em vários lugares mas não obtive sucesso. Espero que alguém aqui possa me ajudar. Fico no aguardo.
Muito Obrigado.