Na verdade, estou usando uma maneira mais simples do que aquela com PGObject e Converters. Como no Postgres os enums são convertidos naturalmente para texto, você só precisa deixá-lo fazer o que faz melhor. Vou pegar emprestado o exemplo de humor de Arjan, se ele não se importar:
O tipo de enumeração no Postgres:
CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');
A classe e enum em Java:
public @Entity class Person {
public static enum Mood {sad, ok, happy};
@Enumerated(EnumType.STRING)
Mood mood;
}
Essa tag @Enumerated diz que a serialização/desserialização da enumeração deve ser feita em texto. Sem ele, ele usa int, que é mais problemático do que qualquer outra coisa.
Neste ponto você tem duas opções. Você também:
-
Adicionar stringtype=unspecified para a string de conexão, conforme explicado nos parâmetros de conexão JDBC. Isso permite que o Postgres adivinhe o tipo do lado direito e converta tudo adequadamente, pois ele recebe algo como 'enum =unknown', que é uma expressão com a qual ele já sabe o que fazer (feed o valor ? para o desserializador de tipo esquerdo). Esta é a opção preferida, como deve funcionar para todos os UDTs simples, como enums, de uma só vez.
jdbc:postgresql://localhost:5432/dbname?stringtype=unspecified
Ou:
-
Crie uma conversão implícita de varchar para enum no banco de dados. Portanto, neste segundo caso, o banco de dados recebe alguma atribuição ou comparação como 'enum =varchar' e encontra uma regra em seu catálogo interno dizendo que pode passar o valor da direita através da função de serialização de varchar seguido pela função de desserialização do enum. São mais passos do que deveriam ser necessários; e ter muitas conversões implícitas no catálogo pode fazer com que consultas arbitrárias tenham interpretações ambíguas, portanto, use-as com moderação. A criação do elenco é:
CRIAR ELENCO (PERSONAGENS VARIANDO conforme humor) COM INOUT COMO IMPLÍCITO;
Deve trabalhar com apenas isso.