1
resposta

[Dúvida] Enum

No desafio eu crie um item a mais no Enum TipoArtista

public enum TipoArtista {
  SOLO,
  DUPLA,
  BANDA,
  GRUPO,
}

Contudo quando informo grupo do cadastro de artista recebo erro

Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement [ERROR: new row for relation "artistas" violates check constraint "artistas_tipo_check"
  Detalhe: Failing row contains (7, Fundo de Quintal, GRUPO).] [insert into artistas (nome,tipo) values (?,?)]

Se informo os três primeiros vai.

1 resposta

Boa noite

O problema não está no enum em Java, e sim no banco de dados.

Quando a tabela artistas foi criada, o Hibernate gerou a coluna tipo com um CHECK constraint baseado nos valores do enum que existiam naquele momento (SOLO, DUPLA, BANDA).
Depois você adicionou GRUPO no enum Java, mas o banco continuou aceitando apenas os valores antigos.

Por isso:

  • SOLO, DUPLA e BANDA funcionam
  • GRUPO gera erro de ConstraintViolationException

O Hibernate até tenta inserir o valor, mas o PostgreSQL bloqueia por causa do constraint artistas_tipo_check.

Como resolver:

A forma mais simples (para projeto de estudo) é recriar a tabela.
Se você apagar a tabela ou usar spring.jpa.hibernate.ddl-auto=create, o Hibernate vai gerar o schema novamente já incluindo GRUPO.

Em um cenário mais próximo do real, o ideal é ajustar o constraint manualmente no banco, removendo o antigo e criando um novo que aceite o valor adicional:

ALTER TABLE artistas DROP CONSTRAINT artistas_tipo_check;

ALTER TABLE artistas ADD CONSTRAINT artistas_tipo_check
CHECK (tipo IN ('SOLO', 'DUPLA', 'BANDA', 'GRUPO'));

Também vale conferir se o mapeamento está usando:

@Enumerated(EnumType.STRING)
private TipoArtista tipo;

Esse formato é o mais seguro, porque evita problemas caso a ordem do enum mude no código.

Resumindo: sempre que você altera um enum que é persistido no banco, o schema precisa ser atualizado também. Só mudar o enum no Java não é suficiente.