Jeg har faktisk brugt en enklere måde end den med PGObject og Converters. Da enums i Postgres konverteres ganske naturligt til-fra tekst, skal du bare lade den gøre det, den er bedst til. Jeg låner Arjans eksempel på stemninger, hvis han ikke gider:
Enum-typen i Postgres:
CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');
Klassen og enum i Java:
public @Entity class Person {
public static enum Mood {sad, ok, happy};
@Enumerated(EnumType.STRING)
Mood mood;
}
Det @Enumerated tag siger, at serialisering/deserialisering af enumet skal udføres i tekst. Uden det bruger den int, hvilket er mere besværligt end noget andet.
På dette tidspunkt har du to muligheder. Du enten:
-
Tilføj stringtype=unspecificed til forbindelsesstrengen, som forklaret i JDBC-forbindelsesparametre. Dette lader Postgres gætte den højre sidetype og konvertere alt tilstrækkeligt, da det modtager noget som 'enum =ukendt', hvilket er et udtryk, som den allerede ved, hvad den skal gøre med (feed værdien ? til den venstre type deserialiser). Dette er den foretrukne mulighed, da det burde fungere for alle simple UDT'er som f.eks. enums på én gang.
jdbc:postgresql://localhost:5432/dbname?stringtype=unspecified
Eller:
-
Opret en implicit konvertering fra varchar til enum i databasen. Så i dette andet tilfælde modtager databasen en tildeling eller sammenligning som 'enum =varchar', og den finder en regel i sit interne katalog, der siger, at den kan sende højrehåndsværdien gennem serialiseringsfunktionen for varchar efterfulgt af deserialiseringsfunktionen for enum. Det er flere skridt end der burde være behov for; og at have for mange implicitte casts i kataloget kan forårsage, at vilkårlige forespørgsler har tvetydige fortolkninger, så brug det sparsomt. Skuespillernes kreation er:
OPRET CAST (KARAKTER VARIERER som humør) MED INOUT SOM IMPLICIT;
Bør fungere med netop det.