PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Java Enums, JPA e Postgres enums - Como faço para que funcionem juntos?


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:

  1. 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:

  1. 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.