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

4 respostas
josimarsis

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

4 Respostas

A

Olá!

Acho que o cascade das classes beam deve ficar assim

cascade = { CascadeType.PERSIST, CascadeType.MERGE }

Abraços

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?

Lavieri

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?

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…

josimarsis

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?

Criado 14 de outubro de 2009
Ultima resposta 15 de out. de 2009
Respostas 4
Participantes 3