Jag har faktiskt använt ett enklare sätt än det med PGObject och Converters. Eftersom enums i Postgres konverteras ganska naturligt till-från text behöver du bara låta den göra det den gör bäst. Jag lånar Arjans exempel på humör, om han inte har något emot det:
Enum-typen i Postgres:
CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');
Klassen och uppräkningen i Java:
public @Entity class Person {
public static enum Mood {sad, ok, happy};
@Enumerated(EnumType.STRING)
Mood mood;
}
Den @Enumerated-taggen säger att serialisering/deserialisering av enumet ska göras i text. Utan det använder den int, vilket är mer besvärligt än något annat.
Vid det här laget har du två alternativ. Du antingen:
-
Lägg till stringtype=unspecificed till anslutningssträngen, som förklaras i JDBC-anslutningsparametrar. Detta låter Postgres gissa typen på höger sida och konvertera allt på ett adekvat sätt, eftersom den tar emot något som 'enum =okänt', vilket är ett uttryck som den redan vet vad den ska göra med (flöde ?-värdet till den vänstra typen deserializer). Detta är det föredragna alternativet, eftersom det borde fungera för alla enkla UDT:er som enums på en gång.
jdbc:postgresql://localhost:5432/dbname?stringtype=unspecified
Eller:
-
Skapa en implicit konvertering från varchar till enum i databasen. Så i det här andra fallet får databasen någon tilldelning eller jämförelse som 'enum =varchar' och den hittar en regel i sin interna katalog som säger att den kan skicka det högra värdet genom serialiseringsfunktionen för varchar följt av deserialiseringsfunktionen för uppräkning. Det är fler steg än vad som borde behövas; och att ha för många implicita casts i katalogen kan orsaka att godtyckliga frågor får tvetydiga tolkningar, så använd det sparsamt. Skådespelaren är:
SKAPA CAST (KARAKTÄR VARIERAR som humör) MED INUT SOM UNDERFÖRSTÅDET;
Borde fungera med just det.