sql >> Database teknologi >  >> RDS >> PostgreSQL

Java Enums, JPA og Postgres enums - Hvordan får jeg dem til at fungere sammen?

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:

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

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



  1. Sådan designes en databasemodel til et biografreservationssystem

  2. Parse kommasepareret streng for at lave IN Liste over strenge i Where-sætningen

  3. Forskellen mellem Oracles plus (+) notation og ansi JOIN notation?

  4. Opbygning af en tabelafhængighedsgraf med en rekursiv forespørgsel