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