Solucionado (ver solução)
Solucionado
(ver solução)
27
respostas

Boa tarde companheiros, minha classe "TesteMovimentacaoComCategoria" deu erro, alguns erros de sql exception e outros erros.

Segue o link para minhas classes:

https://github.com/felipe-travassos/projetinhos/blob/master/src/META-INF/persistence.xml

https://github.com/felipe-travassos/projetinhos/tree/master/src/br/com/caelum/financas
ERROR: Duplicate entry '5' for key 'UK_baaw5yw5oa9j1wj5jdvecq9ba'
org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl release
INFO: HHH000010: On release of batch it still contained JDBC statements
jul 04, 2018 4:45:20 PM org.hibernate.internal.ExceptionMapperStandardImpl mapManagedFlushFailure
ERROR: HHH000346: Error during managed flush [org.hibernate.exception.ConstraintViolationException: could not execute statement]
Exception in thread "main" javax.persistence.RollbackException: Error while committing the transaction
    at org.hibernate.internal.ExceptionConverterImpl.convertCommitException(ExceptionConverterImpl.java:77)
    at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:101)
    at br.com.caelum.financas.teste.TesteMovimentacaoComCategoria.main(TesteMovimentacaoComCategoria.java:54)
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement
    at 
    ... 2 more
Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:59)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:97)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:178)
    at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:45)
    at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1340)
    at org.hibernate.action.internal.CollectionRecreateAction.execute(CollectionRecreateAction.java:50)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:478)
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:356)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
    at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1454)
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:511)
    at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3278)
    at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2474)
    at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:473)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:178)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300(JdbcResourceLocalTransactionCoordinatorImpl.java:39)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:271)
    at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:98)
    ... 1 more
Caused by: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '5' for key 'UK_baaw5yw5oa9j1wj5jdvecq9ba'
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:115)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:95)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:960)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1116)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1066)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1396)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1051)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:175)
    ... 17 more
27 respostas

Opa, Felipe!

Veja pelo erro que trata-se de uma chave duplicada:

Caused by: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '5' for key 'UK_baaw5yw5oa9j1wj5jdvecq9ba'

Você chegou a inserir algo direto pelo BD?

Fala meu amigo Alexandre, não criei nenhuma chave pelo BD. Fiz tudo pelo hibernate mesmo. Com esse erro eu não consigo popular as tabelas movimentacao_categoria no banco.

Hmmm...

Seria interessante entrar no MySQL e ir na tabelas buscando qual tenha a chave única UK_baaw5yw5oa9j1wj5jdvecq9ba.

Pra fazer isso, dá pra rodar:

show create table Tabela;

Eu não entendi Alexandre, queres que eu procure na tabela essa chave?

Olha como tá meu banco:

https://ibb.co/iDnMSJ

Opa, é isso! Pra descobrir de qual tabela é essa UK.

Acho que estaria na aba Indexes, porque é uma UK.

Mas o que eu faria para corrigir?

Opa, Felipe! Não sei ainda! Tô tentando diagnosticar o problema! :D

Acredito que é exatamente isso.

Foi Mal Alexandre. =D To nessa batalha do java web e de vez em quando me prendo nessas dificuldades.

De boa!

Mas, assim, o erro tá acontecendo quando você executa o mesmo código duas vezes com os mesmos dados, né?

Talvez se os dados fossem sempre modificados não daria esse erro.

Eu estou perguntando sobre a UK, pra saber qual dado é esse!

Boa tarde Alexandre, desculpe pela demora, e o erro está acontecendo porque eu executei o código mais de uma vez com os mesmo dados.

Alguem pode me dar um help?

Opa, Felipe.

Pensei que você tinha se conformado com o fato de que você inserir os mesmos dados vai dar esse problema... hehe

Como faço então. Excluo as tabelas do banco e executo novamente as classes testes?

Isso mesmo, Felipe!

Pra descobrir a origem do problema, é aquilo que já tinha dito: veja as UKs (Unique Keys) da aba Indexes e descubra qual é a UK_baaw5yw5oa9j1wj5jdvecq9ba.

Mas eu vi essa chave (UK_baaw5yw5oa9j1wj5jdvecq9ba), já excluí e mandei executar novamente o código e continua dando o mesmo erro. Sinceramente, tô quase desistindo e fazendo o curso do zero novamente. Continua dando erro.

ERROR: Duplicate entry '11' for key 'UK_baaw5yw5oa9j1wj5jdvecq9ba'
jul 11, 2018 11:44:32 AM org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl release
INFO: HHH000010: On release of batch it still contained JDBC statements
jul 11, 2018 11:44:32 AM org.hibernate.internal.ExceptionMapperStandardImpl mapManagedFlushFailure
ERROR: HHH000346: Error during managed flush [org.hibernate.exception.ConstraintViolationException: could not execute statement]
Exception in thread "main" javax.persistence.RollbackException: Error while committing the transaction

Em qual tabela era, Felipe?

Era na movimento.

E envolvia o id da tabela Movimentacao?

Sim, envolvia a chave de outra tabela. Especificamente o cat_id.

Na verdade essa chave é databela movimentação categoria. E envolve o cat_id que tem como tabela referencia categoria.

Felipe,

Consegui entender melhor o cenário agora!

Mais tarde explico o que está acontecendo.

solução!

Olá, Felipe!

Na sua classe Movimentacao, você a lista de Categorias assim:

@Entity
public class Movimentacao {

    //... 

    @OneToMany
    private List<Categoria> cat;

    //...

}

A anotação @OneToMany indica que uma Movimentacao pode pertencer a várias categorias mas uma Categoria não pode ser usada em mais de uma Movimentacao.

Como, na classe TesteMovimentacaoComCategoria, usamos as mesmas categorias em duas movimentações diferentes, acontece esse erro na chave única (UK).

Na aula, usamos o @ManyToMany, que indica tanto que uma Movimentacao pode pertencer a várias categorias (o que ocorre no seu caso) como que uma Categoria pode ser usadas por várias movimentações.

Então, mude o mapeamento para:

@Entity
public class Movimentacao {

    //... 

    @ManyToMany //modificado
    private List<Categoria> cat;

    //...

}

Não deixe de apagar as tabelas e criá-las novamente.

Ah, um detalhe: no teste, você depende de ter uma Conta cujo id é 2. Não deixe de criá-la!

Em ambos os casos, do jeito que foi mapeado, será criada uma tabela de relacionamento entre Movimentacao e Categoria.

Isso ocorre porque numa tabela de um BD relacional, NÃO pode ter uma coluna que guarda uma lista de valores (coluna multivalorada). Na teoria relacional, é o que chamamos de Quarta Forma Normal.

Há um jeito de um mapeamento @OneToMany não gerar uma tabela de relacionamento. Isso é um dos assuntos da aula 7, os Relacionamentos Bidirecionais.

Bom dia professor, vou fazer os testes e as correções. Se ficar redondo pago uma pizza rsrs.

Que isso, Felipe! Estou aqui pra isso!

Espero que a explicação tenha ficado clara.

Boa noite Prof. Alexandre, obrigado pelas dicas, eu fiz as correções e o código executou, foram criadas as tabelas novamente, com os relacionamentos, e foram inseridas as querys relacionadas aos relacionamentos.

Obrigado pela sua disponibilidade em me ajudar.

Confesso que nesses momentos que fico perdido não consigo resolver essas exceptions.

Muito obrigado e abraços.