Erro JPA/Hibernate - org.hibernate.jdbc.BatchingBatcher doExecuteBatch

Olá galera Estou tendo um problema com relacionamento ManyToMany eu tenho as entidades produto, fornecedor e uma tabela intermediaria produto_fornecedor ate onde eu entendi o jpa faz a gerencia da tabela do meio caso minhas entidades estejam devidamente anotadas e está tudo funcionado na hora de salvar e alterar porem na hora de excluir estou tendo a seguinte exceção:

14/10/2009 15:16:40 org.hibernate.jdbc.BatchingBatcher doExecuteBatch SEVERE: Exception executing batch: org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:61) at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:46) at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:68) at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246) at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:92) at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:87) at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:222) at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2479) at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2697) at org.hibernate.action.EntityDeleteAction.execute(EntityDeleteAction.java:74) at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:234) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:146) at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298) at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27) 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) at Persistencia.Conexao.Excluir(Conexao.java:86) at Visao.Cadastros.FrmProduto.Excluir(FrmProduto.java:1280) at HerancaVisual.MasterCadastro.jbExcluirActionPerformed(MasterCadastro.java:237) at HerancaVisual.MasterCadastro.access$800(MasterCadastro.java:20) at HerancaVisual.MasterCadastro$9.actionPerformed(MasterCadastro.java:109) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) at java.awt.Component.processMouseEvent(Component.java:6134) at javax.swing.JComponent.processMouseEvent(JComponent.java:3265) at java.awt.Component.processEvent(Component.java:5899) at java.awt.Container.processEvent(Container.java:2023) at java.awt.Component.dispatchEventImpl(Component.java:4501) at java.awt.Container.dispatchEventImpl(Container.java:2081) at java.awt.Component.dispatchEvent(Component.java:4331) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4301) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3965) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3895) at java.awt.Container.dispatchEventImpl(Container.java:2067) at java.awt.Window.dispatchEventImpl(Window.java:2458) at java.awt.Component.dispatchEvent(Component.java:4331) at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

//Bean Produto //Configuração personalizada para gerencia de anotação ManyToMany Tabela produto_fornecedor @ManyToMany(cascade = CascadeType.MERGE, targetEntity=Fornecedor.class) @JoinTable(name="produto_fornecedor", joinColumns=@JoinColumn(name="prod_codigo"), inverseJoinColumns=@JoinColumn(name="forn_codigo")) private List<Fornecedor> fornecedores;

//Bean Fornecedor //Configuração personalizada para gerencia de anotação ManyToMany Tabela produto_fornecedor @ManyToMany(cascade=CascadeType.MERGE, targetEntity=Produto.class, mappedBy="fornecedores") @JoinTable(name="produto_fornecedor") private List<Produto> produtos;

//Codigo do botão excluir EntityManager manager = null; try { manager = Conexao.getConexao(); int codigo = listaProduto.get(consultar.getCodigoPesquisado()).getProdCodigo(); beanProduto = manager.find(Produto.class, codigo); Conexao.Excluir(beanProduto, manager); Limpar(); } catch (Exception ex) { manager.getTransaction().rollback(); Logger.getLogger(FrmProduto.class.getName()).log(Level.SEVERE, null, ex); }

//metodo Excluir public static void Excluir(Object objeto, EntityManager manager) throws Exception { try { if (JOptionPane.showConfirmDialog(null, "Confirma exclusão?", "Alerta", JOptionPane.WARNING_MESSAGE) == 0) { manager.getTransaction().begin(); manager.remove(objeto); manager.getTransaction().commit(); JOptionPane.showMessageDialog(null, "Excluido com sucesso", "", JOptionPane.PLAIN_MESSAGE); } } catch (Exception e) { tratarDbException(e); manager.getTransaction().rollback(); } }

Olá!

Acho que o cascade das classes beam deve ficar assim

cascade = { CascadeType.PERSIST, CascadeType.MERGE }

Abraços

asensio a sua dica resolveu o caso da exclusão porem na hora de incluir esta dizendo que o meu objeto “chave estrangeira” esta datached, existe alguma outra maneira
de tornar um objeto datached em um objeto managed que não seja o metodo find?

[quote=josimarsis]asensio a sua dica resolveu o caso da exclusão porem na hora de incluir esta dizendo que o meu objeto “chave estrangeira” esta datached, existe alguma outra maneira
de tornar um objeto datached em um objeto managed que não seja o metodo find?[/quote]

EntityManager.refresh

EDIT… de toda forma, não faça mapeamento bi-direcional, escolha um lado, e deiche o mapeamento só deste lado, quando precisar dos dados do outro lado, faça um consulta… gerenciar os 2 lados é algo complicado, e pode gerar perdas para o seu sistema…

tentei o refresh mais não funcionou é o seguinte eu tenho uma entidade produto e na entidade produto eu passo uma lista de fornecedores, porem os objetos que estão dentro do List() estão datached, sendo assim quando faço:

beanProduto.setForencedores(listaForencedores); entityManager.persist(beanProduto);
recebo o seguinte erro:

Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: Beans.Fornecedor

Tem alguma maneira de eu tornar os objetos que estão dentro do meu List em managed? Quando faço

beanProduto.setForencedores(listaForencedores); entityManager.merge(beanProduto);
Os dados são salvos no banco de dados porém quando preciso fazer uma alteração e consulto os dados com find e depois dou um merge os meus dados estão sendo duplicados no banco de dados! Como proceder neste caso?