JPA/Hibernate - integridade referencial

6 respostas
josimarsis

Olá galera é o seguinte estou com um problema que não consegui resolver! Quando anoto minhas entidades com CascadeType.ALL elas perdem a integridade referencial, segue abaixo um exemplo do que esta acontecendo. Eu tenho a entidade TipoUsuario que é chave estrangeira em Usuario ou seja se eu ja tiver um TipoUsuario sendo usando na tabela Usuario ele não pode ser excluido! Porem usando o CascadeType.ALL a operação de excluir é realizada ignorando a integridade referencial do banco! Por que?

//Entidade TipoUsuario
@Entity
@Table(name = "tipo_usuario")
@NamedQueries({@NamedQuery(name = "TipoUsuario.findAll", query = "SELECT t FROM TipoUsuario t"), @NamedQuery(name = "TipoUsuario.findByTusuCodigo", query = "SELECT t FROM TipoUsuario t WHERE t.tusuCodigo = :tusuCodigo"), @NamedQuery(name = "TipoUsuario.findByTusuDescricao", query = "SELECT t FROM TipoUsuario t WHERE t.tusuDescricao = :tusuDescricao")})
public class TipoUsuario implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "tusu_codigo")
    private Integer tusuCodigo;
    @Basic(optional = false)
    @Column(name = "tusu_descricao")
    private String tusuDescricao;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "tusuCodigo")
    private Collection<Usuario> usuarioCollection;

    public TipoUsuario() {
    }

    public TipoUsuario(Integer tusuCodigo) {
        this.tusuCodigo = tusuCodigo;
    }

    public TipoUsuario(Integer tusuCodigo, String tusuDescricao) {
        this.tusuCodigo = tusuCodigo;
        this.tusuDescricao = tusuDescricao;
    }

    public Integer getTusuCodigo() {
        return tusuCodigo;
    }

    public void setTusuCodigo(Integer tusuCodigo) {
        this.tusuCodigo = tusuCodigo;
    }

    public String getTusuDescricao() {
        return tusuDescricao;
    }

    public void setTusuDescricao(String tusuDescricao) {
        this.tusuDescricao = tusuDescricao;
    }

    public Collection<Usuario> getUsuarioCollection() {
        return usuarioCollection;
    }

    public void setUsuarioCollection(Collection<Usuario> usuarioCollection) {
        this.usuarioCollection = usuarioCollection;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (tusuCodigo != null ? tusuCodigo.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof TipoUsuario)) {
            return false;
        }
        TipoUsuario other = (TipoUsuario) object;
        if ((this.tusuCodigo == null && other.tusuCodigo != null) || (this.tusuCodigo != null && !this.tusuCodigo.equals(other.tusuCodigo))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Beans.TipoUsuario[tusuCodigo=" + tusuCodigo + "]";
    }

}
//Entidade Usuario
@Entity
@Table(name = "usuario")
@NamedQueries({@NamedQuery(name = "Usuario.findAll", query = "SELECT u FROM Usuario u"), @NamedQuery(name = "Usuario.findByUsuCodigo", query = "SELECT u FROM Usuario u WHERE u.usuCodigo = :usuCodigo"), @NamedQuery(name = "Usuario.findByUsuUsuario", query = "SELECT u FROM Usuario u WHERE u.usuUsuario = :usuUsuario"), @NamedQuery(name = "Usuario.findByUsuSenha", query = "SELECT u FROM Usuario u WHERE u.usuSenha = :usuSenha")})
public class Usuario implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "usu_codigo")
    private Integer usuCodigo;
    @Basic(optional = false)
    @Column(name = "usu_usuario")
    private String usuUsuario;
    @Basic(optional = false)
    @Column(name = "usu_senha")
    private String usuSenha;
    @JoinColumn(name = "tusu_codigo", referencedColumnName = "tusu_codigo")
    @ManyToOne(optional = false)
    private TipoUsuario tusuCodigo;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "usuCodigo")
    private Collection<CabVendas> cabVendasCollection;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "usuCodigo")
    private Collection<UsuLog> usuLogCollection;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "usuCodigo")
    private Collection<EntradaProdutos> entradaProdutosCollection;

    public Usuario() {
    }

    public Usuario(Integer usuCodigo) {
        this.usuCodigo = usuCodigo;
    }

    public Usuario(Integer usuCodigo, String usuUsuario, String usuSenha) {
        this.usuCodigo = usuCodigo;
        this.usuUsuario = usuUsuario;
        this.usuSenha = usuSenha;
    }

    public Integer getUsuCodigo() {
        return usuCodigo;
    }

    public void setUsuCodigo(Integer usuCodigo) {
        this.usuCodigo = usuCodigo;
    }

    public String getUsuUsuario() {
        return usuUsuario;
    }

    public void setUsuUsuario(String usuUsuario) {
        this.usuUsuario = usuUsuario;
    }

    public String getUsuSenha() {
        return usuSenha;
    }

    public void setUsuSenha(String usuSenha) {
        this.usuSenha = usuSenha;
    }

    public TipoUsuario getTusuCodigo() {
        return tusuCodigo;
    }

    public void setTusuCodigo(TipoUsuario tusuCodigo) {
        this.tusuCodigo = tusuCodigo;
    }

    public Collection<CabVendas> getCabVendasCollection() {
        return cabVendasCollection;
    }

    public void setCabVendasCollection(Collection<CabVendas> cabVendasCollection) {
        this.cabVendasCollection = cabVendasCollection;
    }

    public Collection<UsuLog> getUsuLogCollection() {
        return usuLogCollection;
    }

    public void setUsuLogCollection(Collection<UsuLog> usuLogCollection) {
        this.usuLogCollection = usuLogCollection;
    }

    public Collection<EntradaProdutos> getEntradaProdutosCollection() {
        return entradaProdutosCollection;
    }

    public void setEntradaProdutosCollection(Collection<EntradaProdutos> entradaProdutosCollection) {
        this.entradaProdutosCollection = entradaProdutosCollection;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (usuCodigo != null ? usuCodigo.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Usuario)) {
            return false;
        }
        Usuario other = (Usuario) object;
        if ((this.usuCodigo == null && other.usuCodigo != null) || (this.usuCodigo != null && !this.usuCodigo.equals(other.usuCodigo))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Beans.Usuario[usuCodigo=" + usuCodigo + "]";
    }

}
//Codigo do Botão excluir
EntityManager manager = null;
        try {
            manager = Conexao.getConexao();
            int codigo = listaTipoUsuario.get(consultar.getCodigoPesquisado()).getTusuCodigo();
            beanTipoUsuario = manager.find(TipoUsuario.class, codigo);
            Conexao.Excluir(beanTipoUsuario, manager);
            Limpar();
            // Atualiza o Combo jcbTipoUsuario do Cadastro de Usuario
            FrmUsuario.getFrmUsuario().preencheComboTipoUsuario();
        } catch (Exception e) {
            Logger.getLogger(FrmTipoUsuario.class.getName()).log(Level.SEVERE, null, e);
        }
//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) {
            manager.getTransaction().rollback();
            tratarDbException(e);
        }
    }

6 Respostas

R

O Hibernate não tem como ignorar a integridade referencial do Banco de Dados - se o BD se recusar a excluir um registro visando manter a integridade referencial, isso gerará um erro que o Hibernate irá capturar e reportar através de uma exceção. Tem certeza de que a integridade referencial está configurada corretamente no seu BD?

josimarsis

Olha amigo meus relacionamentos estão marcados com delete restrict tanto é que se tento excluir um tipo de usuario que ja esteja sendo usando em um usuario cadastrado usando a ferramenta de consuta sql que utilizo a operação é negada. Quando faço a deleção pelo meu sistema ele exclui o tipo de usuario e todos os usuarios cadastrados como o tipo deletado! Dai se eu mudo o CascadeType.ALL para CascadeType.MERGE o banco passa a respeitar a integridade referencial. Já pesquisei pra todo lado e não consegui entender o pq isso esta ocorrendo por que pelo que parece o CascadeType.ALL é o mais recomendado certo?

josimarsis

Alguem tem ideia do que esta ocorrendo? o banco de dados é o Mysql. O CascadeType.ALL é o responsavel por isso? Meus beans estão sendo gerados automaticamente pelo netbeans isso é correto?

R

O CascadeType.ALL pode ser o responsável por isso, sim. Creio que estamos com o seguinte cenário:

  • Os tipos de usuário estão mapeados numa classe TipoUsuario;
  • Os usuários estão mapeados numa classe Usuario;
  • A classe TipoUsuario possui uma Collection (List, Set, etc.) contendo os usuários relacionados ao tipo de usuário; e essa Collection está anotada como CascadeType.ALL; e a classe Usuario possui um atributo TipoUsuario.

Atendidas essas condições, a relação entre Usuario e TipoUsuario está mapeada de forma bidirecional. E, devido à anotação CascadeType.ALL na Collection, excluir uma entidade TipoUsuario forçará a exclusão dos usuários associados. Creio que a exclusão não falhará porque o Hibernate, antes de excluir o tipo de usuário, vai carregar a Collection de usuários e sair excluindo os itens dela um a um. Assim, como não háverá registros dependentes do tipo de usuário, também não haverá violação de integridade referencial.

Moral da história: configure o CascadeType da forma que fizer mais sentido para a sua aplicação, não existe uma configuração “mais recomendada”. No contexto da sua aplicação, creio que é mais adequado deixar o atributo cascade= vazio.

Não há problema em usar os Bean’s gerados automaticamente pelo NetBeans, mas você precisa entender a semântica que eles impõem à manipulação de dados da sua aplicação. Ao definir um relacionamento bidirecional, criou-se uma relação Pai/Filho entre TipoUsuario/Usuario, o que creio que não é correto - TipoUsuario é apenas mais uma chave estrangeira de Usuario, e não uma classe “Pai”. Assim, não caberia usar CascadeType.ALL.

josimarsis

realmente roger_rf está acontecendo isso. Olha o sql que consegui pegar do Hibernate.

Hibernate: select tipousuari0_.tusu_codigo as tusu1_8_0_, tipousuari0_.tusu_descricao as tusu2_8_0_ from tipo_usuario tipousuari0_ where tipousuari0_.tusu_codigo=? Hibernate: select usuariocol0_.tusu_codigo as tusu4_1_, usuariocol0_.usu_codigo as usu1_1_, usuariocol0_.usu_codigo as usu1_24_0_, usuariocol0_.tusu_codigo as tusu4_24_0_, usuariocol0_.usu_senha as usu2_24_0_, usuariocol0_.usu_usuario as usu3_24_0_ from usuario usuariocol0_ where usuariocol0_.tusu_codigo=? Hibernate: select cabvendasc0_.usu_codigo as usu10_2_, cabvendasc0_.cab_codigo as cab1_2_, cabvendasc0_.cab_codigo as cab1_23_1_, cabvendasc0_.cab_acrescimo as cab2_23_1_, cabvendasc0_.cab_data as cab3_23_1_, cabvendasc0_.cab_desconto as cab4_23_1_, cabvendasc0_.cab_nf as cab5_23_1_, cabvendasc0_.cab_num_parcelas as cab6_23_1_, cabvendasc0_.cab_total as cab7_23_1_, cabvendasc0_.cab_valor as cab8_23_1_, cabvendasc0_.cli_codigo as cli9_23_1_, cabvendasc0_.usu_codigo as usu10_23_1_, cliente1_.cli_codigo as cli1_36_0_, cliente1_.cli_apelido as cli2_36_0_, cliente1_.cli_cargo as cli3_36_0_, cliente1_.cli_cpf_cnpj as cli4_36_0_, cliente1_.cli_data_registro as cli5_36_0_, cliente1_.cli_email as cli6_36_0_, cliente1_.cli_empregador as cli7_36_0_, cliente1_.cli_fone_ref1 as cli8_36_0_, cliente1_.cli_fone_ref2 as cli9_36_0_, cliente1_.cli_inscricao_estadual as cli10_36_0_, cliente1_.cli_limite_credito as cli11_36_0_, cliente1_.cli_mae as cli12_36_0_, cliente1_.cli_nascimento as cli13_36_0_, cliente1_.cli_nome as cli14_36_0_, cliente1_.cli_observacoes as cli15_36_0_, cliente1_.cli_org_expedidor_rg as cli16_36_0_, cliente1_.cli_refcomercial1 as cli17_36_0_, cliente1_.cli_refcomercial2 as cli18_36_0_, cliente1_.cli_rg as cli19_36_0_, cliente1_.cli_setor as cli20_36_0_, cliente1_.cli_sexo as cli21_36_0_, cliente1_.cli_situacao as cli22_36_0_, cliente1_.cli_status as cli23_36_0_, cliente1_.cli_tipo as cli24_36_0_, cliente1_.cli_uf_rg as cli25_36_0_ from cab_vendas cabvendasc0_ inner join cliente cliente1_ on cabvendasc0_.cli_codigo=cliente1_.cli_codigo where cabvendasc0_.usu_codigo=? Hibernate: select entradapro0_.usu_codigo as usu12_10_, entradapro0_.ent_codigo as ent1_10_, entradapro0_.ent_codigo as ent1_4_9_, entradapro0_.ent_aliq_icms as ent2_4_9_, entradapro0_.ent_data_entrada as ent3_4_9_, entradapro0_.ent_data_real as ent4_4_9_, entradapro0_.ent_num_nf as ent5_4_9_, entradapro0_.ent_qtd_produto as ent6_4_9_, entradapro0_.ent_status as ent7_4_9_, entradapro0_.ent_total as ent8_4_9_, entradapro0_.ent_vlr_unitario as ent9_4_9_, entradapro0_.forn_codigo as forn10_4_9_, entradapro0_.prod_codigo as prod11_4_9_, entradapro0_.usu_codigo as usu12_4_9_, fornecedor1_.forn_codigo as forn1_37_0_, fornecedor1_.end_codigo as end6_37_0_, fornecedor1_.forn_cnpj as forn2_37_0_, fornecedor1_.forn_email as forn3_37_0_, fornecedor1_.forn_inscricao_estadual as forn4_37_0_, fornecedor1_.forn_razao_social as forn5_37_0_, endereco2_.end_codigo as end1_2_1_, endereco2_.bai_codigo as bai4_2_1_, endereco2_.cep_codigo as cep5_2_1_, endereco2_.end_complemento as end2_2_1_, endereco2_.end_numero as end3_2_1_, endereco2_.log_codigo as log6_2_1_, endereco2_.tend_codigo as tend7_2_1_, produto3_.prod_codigo as prod1_11_2_, produto3_.cor_codigo as cor19_11_2_, produto3_.marca_codigo as marca20_11_2_, produto3_.prod_aliquota_tributacao as prod2_11_2_, produto3_.prod_aplicacao as prod3_11_2_, produto3_.prod_cod_barras as prod4_11_2_, produto3_.prod_descricao as prod5_11_2_, produto3_.prod_dimensao as prod6_11_2_, produto3_.prod_estoque_maximo as prod7_11_2_, produto3_.prod_estoque_minimo as prod8_11_2_, produto3_.prod_foto as prod9_11_2_, produto3_.prod_lucro_venda as prod10_11_2_, produto3_.prod_lucro_venda_atacado as prod11_11_2_, produto3_.prod_porcentagem as prod12_11_2_, produto3_.prod_porcentagem_atacado as prod13_11_2_, produto3_.prod_preco_custo as prod14_11_2_, produto3_.prod_preco_venda as prod15_11_2_, produto3_.prod_preco_venda_atacado as prod16_11_2_, produto3_.prod_qtd_atacado as prod17_11_2_, produto3_.prod_tributacao as prod18_11_2_, produto3_.subg_codigo as subg21_11_2_, produto3_.uni_codigo as uni22_11_2_, produto3_.z_codigo as z23_11_2_, cor4_.cor_codigo as cor1_16_3_, cor4_.cor_descricao as cor2_16_3_, marca5_.marca_codigo as marca1_10_4_, marca5_.marca_descricao as marca2_10_4_, subgrupo6_.subg_codigo as subg1_13_5_, subgrupo6_.gru_codigo as gru3_13_5_, subgrupo6_.subg_descricao as subg2_13_5_, unidade7_.uni_codigo as uni1_30_6_, unidade7_.uni_descricao as uni2_30_6_, unidade7_.uni_sigla as uni3_30_6_, localz8_.z_codigo as z1_6_7_, localz8_.y_codigo as y3_6_7_, localz8_.z_descricao as z2_6_7_, estoque9_.prod_codigo as prod1_9_8_, estoque9_.est_data_movimentacao as est2_9_8_, estoque9_.est_quantidade as est3_9_8_ from entrada_produtos entradapro0_ inner join fornecedor fornecedor1_ on entradapro0_.forn_codigo=fornecedor1_.forn_codigo left outer join endereco endereco2_ on fornecedor1_.end_codigo=endereco2_.end_codigo inner join produto produto3_ on entradapro0_.prod_codigo=produto3_.prod_codigo left outer join cor cor4_ on produto3_.cor_codigo=cor4_.cor_codigo left outer join marca marca5_ on produto3_.marca_codigo=marca5_.marca_codigo left outer join sub_grupo subgrupo6_ on produto3_.subg_codigo=subgrupo6_.subg_codigo left outer join unidade unidade7_ on produto3_.uni_codigo=unidade7_.uni_codigo left outer join local_z localz8_ on produto3_.z_codigo=localz8_.z_codigo left outer join estoque estoque9_ on produto3_.prod_codigo=estoque9_.prod_codigo where entradapro0_.usu_codigo=? Hibernate: select usulogcoll0_.usu_codigo as usu5_1_, usulogcoll0_.usulog_codigo as usulog1_1_, usulogcoll0_.usulog_codigo as usulog1_25_0_, usulogcoll0_.usu_codigo as usu5_25_0_, usulogcoll0_.usulog_data as usulog2_25_0_, usulogcoll0_.usulog_hora as usulog3_25_0_, usulogcoll0_.usulog_serialhd as usulog4_25_0_ from usu_log usulogcoll0_ where usulogcoll0_.usu_codigo=? Hibernate: delete from usu_log where usulog_codigo=? Hibernate: delete from usuario where usu_codigo=? Hibernate: delete from tipo_usuario where tusu_codigo=? Hibernate: select tipousuari0_.tusu_codigo as tusu1_8_, tipousuari0_.tusu_descricao as tusu2_8_ from tipo_usuario tipousuari0_ order by tipousuari0_.tusu_descricao Hibernate: select tipousuari0_.tusu_codigo as tusu1_8_, tipousuari0_.tusu_descricao as tusu2_8_ from tipo_usuario tipousuari0_ order by tipousuari0_.tusu_descricao

Moral da Historia ele passa apagando os filhos todos e depois apaga o tipo do usuario! Sou novato em JPA e tenho muitas duvidas, percebi tbm que quando uso o CascadeType.MERGE tenho o resultado esperado!

Estou tendo outro problema agora 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 esteja devidamente anotadas e está tudo funcionado na hora de salva e alterar porem na hora de excluir estou tendo a seguinte exceção:

14/10/2009 10:37:54 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:1251) 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) 14/10/2009 10:37:54 org.hibernate.event.def.AbstractFlushingEventListener performExecutions SEVERE: Could not synchronize database state with session 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:1251) 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) Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Transaction not active at org.hibernate.ejb.TransactionImpl.rollback(TransactionImpl.java:82) at Visao.Cadastros.FrmProduto.Excluir(FrmProduto.java:1254) 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)

anotações utilizadas no relacionamento ManyToMany

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

Lavieri

para mecher em integridade referencial olhe esse exemplo => http://guj.com.br/posts/list/141241.java

Criado 13 de outubro de 2009
Ultima resposta 14 de out. de 2009
Respostas 6
Participantes 3