sql >> Base de Datos >  >> RDS >> PostgreSQL

Java Enums, JPA y Postgres enums:¿cómo puedo hacer que funcionen juntos?

De hecho, he estado usando una forma más simple que la de PGObject y Converters. Dado que en Postgres, las enumeraciones se convierten de forma bastante natural a texto, solo necesita dejar que haga lo que mejor hace. Tomaré prestado el ejemplo de estados de ánimo de Arjan, si no le importa:

El tipo de enumeración en Postgres:

CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');

La clase y la enumeración en Java:

public @Entity class Person {

  public static enum Mood {sad, ok, happy};

  @Enumerated(EnumType.STRING)
  Mood mood;

Esa etiqueta @Enumerated dice que la serialización/deserialización de la enumeración debe hacerse en texto. Sin él, usa int, que es más problemático que cualquier otra cosa.

En este punto tienes dos opciones. Tú:

  1. Añadir stringtype=sin especificar a la cadena de conexión, como se explica en los parámetros de conexión de JDBC. Esto le permite a Postgres adivinar el tipo del lado derecho y convertir todo adecuadamente, ya que recibe algo como 'enum =unknown', que es una expresión con la que ya sabe qué hacer (feed el valor ? al deserializador de tipo izquierdo). Esta es la opción preferida, ya que debería funcionar para todos los UDT simples, como las enumeraciones, de una sola vez.

    jdbc:postgresql://localhost:5432/dbname?stringtype=unspecified
    

O:

  1. Cree una conversión implícita de varchar a la enumeración en la base de datos. Entonces, en este segundo caso, la base de datos recibe alguna asignación o comparación como 'enum =varchar' y encuentra una regla en su catálogo interno que dice que puede pasar el valor de la derecha a través de la función de serialización de varchar seguido de la función de deserialización del enumeración Son más pasos de los que deberían ser necesarios; y tener demasiados moldes implícitos en el catálogo puede hacer que las consultas arbitrarias tengan interpretaciones ambiguas, así que utilícelo con moderación. La creación del reparto es:

    CREAR REPARTO (PERSONAJE VARIADO como estado de ánimo) CON INOUT COMO IMPLÍCITO;

Debería funcionar solo con eso.