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

Não funciona de jeito nenhum

Pessoal, alguem pode me ajudar?

Estou tendo o erro Caused by: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '5' for key 'movimentacao_categoria.UK_nf3ulaoqe53gtm70wfwnpl79x' ao executar.

Eu coloquei o código no GitHub

Observações: Estou usando o MySQL 8.22, (instalado de acordo com essa aula) junto com o driver desta mesma versão (como eu mostro no pom.xml) e também a última versão estável do Hibernate (também no pom.xml).

Todas as outras aulas funcionaram normalmente, só aqui que não.

Eu também já tentei importar o projeto do Instrutor e configurar de acordo com o meu pom.xml e Persistence.xml e nada.

5 respostas

Oi Arthur

O problema é que quando você está salvando um novo registro na tabela movimentacao_categoria já existe um registro com o ID 5. Olha no seu banco de dados na tabela movimentacao_categoria, já deve ter algum registro usando o ID 5, como é uma UniqueKey (UK) vai dar erro se tentar salvar novamente.

a tabela movimentacao_categoria foi criado manualmente no seu mysql ou o hibernate que criou?

Oi Otávio, foi o hibernate que criou. Eu utilizo o Workbench como apoio, e o script que eu executo antes de executar o teste da MovimentacaoComCategoria, é este:

Pode ver que o banco está "limpo" antes de executar o teste no Eclipse.

drop database projeto_jpa;

create database projeto_jpa;

use projeto_jpa;
CREATE TABLE CONTA
 (
 id bigint not null auto_increment,
 titular varchar(255),
 agencia integer,
 numero integer,
 saldo double precision,        
 primary key (id)
 )
 Engine = InnoDB;

insert into conta(agencia,numero,titular,saldo) values (123,789,'Leonardo',700.0);
insert into conta(agencia,numero,titular,saldo) values (123,788,'Juliano',500.0);

Eu francamente não sei mais o que tentar.

solução!

Olhando aqui o código do seu projeto, na sua classe Movimentacao, a lista de Categorias está assim:

@Entity
public class Movimentacao {

    //... 

        @OneToMany
    private List<Categoria> categorias = new ArrayList<>();

    //...

}

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, é usado as mesmas categorias em duas movimentações diferentes, acontece esse erro na chave única (UK).

Na aula é usado @ManyToMany, que indica tanto que uma Movimentacao pode pertencer a várias categorias e uma Categoria pode ser usada por várias movimentações.

Então, mude o mapeamento para:

@Entity
public class Movimentacao {

    //... 

    @ManyToMany // <<< mudança no relacionamento aqui
    private List<Categoria> cat;

    //...

}

Você vai precisar apagar suas tabelas e criá-las novamente. Em ambos os casos, do jeito que foi mapeado, será criada uma tabela de relacionamento entre Movimentacao e Categoria.

Deve resolver amigo (=

Otávio, muito obrigado, de verdade.

Eu fiquei quase 4 horas tentando entender o que estava acontecendo. E era apenas isso.

Por favor, se puder, fala pro pessoal responsável por este link https://cursos.alura.com.br/course/jpa-hibernate-persistencia-objetos/task/71568 corrigir este erro. Tudo bem que, foi falta de atenção minha mas alguém pode passar pela mesma coisa. Mais uma vez, muito, mas muito obrigado!