3
respostas

Mensagem na hora de excluir um objeto associado a outro java web

Opa não estou conseguindo mostrar a mensagem quando tento excluir um objeto associado a outro, quando olho no console até me assusto com esse erro de ConstrainViolationException.

Caused by: org.hibernate.exception.ConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`bercalini`.`produto`, CONSTRAINT `FK50C666D9A286DEA4` FOREIGN KEY (`marca_codigo`) REFERENCES `marca` (`codigo`))
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:74)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
    at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129)
    at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
    at com.sun.proxy.$Proxy60.executeUpdate(Unknown Source)
    at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:56)
    at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3303)
    at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3506)
    at org.hibernate.action.internal.EntityDeleteAction.execute(EntityDeleteAction.java:100)
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:354)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:280)
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:326)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52)
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1213)
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:402)
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)
    at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:75)
    ... 51 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`bercalini`.`produto`, CONSTRAINT `FK50C666D9A286DEA4` FOREIGN KEY (`marca_codigo`) REFERENCES `marca` (`codigo`))
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.Util.getInstance(Util.java:386)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1040)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2734)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2458)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359)
    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 org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)
    ... 67 more

Oque eu quero é quando clicar no botão excluir e se o objeto for associado o outro mostrar a mensagem. Mais não entendo o porque não está saindo a mensagem.

bean

    @Transacional
    public void excluir() {
        marca.setCodigo(codigo);
        System.out.println("Código da marca que foi excluida: " + this.codigo);
        try {
            marcaDao.remover(marca);
            Mensagem.mensagemInfo("Marca excluida com sucesso");
        } catch (ConstraintViolationException e) {
            Mensagem.mensagemError("Essa marca já está associada com um produto, erro ao excluir");
        }
    }

dao

public void remover(Marca marca) {
        try {
        manager.remove(manager.merge(marca));
        } catch(ConstraintViolationException e) {
            e.printStackTrace();
        }
    }
3 respostas

Olá Allison!,

O seu método remover está retendo a exception, e dessa forma ela não está sendo propagada para o método excluir.

Tenta centralizar o controle de exceções em apenas um lugar.

Exemplo:

public void remover(Marca marca) {
        manager.remove(manager.merge(marca));
    }
 @Transacional
    public void excluir() {
        marca.setCodigo(codigo);
        System.out.println("Código da marca que foi excluida: " + this.codigo);
        try {
            marcaDao.remover(marca);
            Mensagem.mensagemInfo("Marca excluida com sucesso");
        } catch (ConstraintViolationException e) {
            Mensagem.mensagemError("Essa marca já está associada com um produto, erro ao excluir");
    e.printStackTrace(); // De preferencia coloque a mensagem em um Log ao inves de exibir no console
        }
    }

Já tentei desse jeito, essa forma foi a primeira tentativa, não não rolou assim tbm

Bom, como estamos capturando ConstraintViolationException e está sendo lançada (a principio) uma MySQLIntegrityConstraintViolationException (que não herda da Constraint, vide ->http://www.docjar.com/docs/api/com/mysql/jdbc/exceptions/MySQLIntegrityConstraintViolationException.html)

Experimenta algo assim:

 @Transacional
    public void excluir() {
        marca.setCodigo(codigo);
        System.out.println("Código da marca que foi excluida: " + this.codigo);
        try {
            marcaDao.remover(marca);
            Mensagem.mensagemInfo("Marca excluida com sucesso");
        } catch (ConstraintViolationException || MySQLIntegrityConstraintViolationException  e) {
            Mensagem.mensagemError("Essa marca já está associada com um produto, erro ao excluir");
    e.printStackTrace(); // De preferencia coloque a mensagem em um Log ao inves de exibir no console
        }
    }

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software