PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Java Enums, JPA und Postgres Enums - Wie bringe ich sie dazu, zusammenzuarbeiten?

Ich habe tatsächlich einen einfacheren Weg als den mit PGObject und Converters verwendet. Da in Postgres Aufzählungen ganz natürlich in Text konvertiert werden, müssen Sie es nur tun lassen, was es am besten kann. Ich leihe mir Arjans Stimmungsbeispiel aus, wenn es ihm nichts ausmacht:

Der Enum-Typ in Postgres:

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

Die Klasse und Aufzählung in Java:

public @Entity class Person {

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

  @Enumerated(EnumType.STRING)
  Mood mood;

}

Das @Enumerated-Tag besagt, dass die Serialisierung/Deserialisierung der Aufzählung im Text erfolgen sollte. Ohne sie wird int verwendet, was lästiger als alles andere ist.

An dieser Stelle haben Sie zwei Möglichkeiten. Sie entweder:

  1. Fügen Sie stringtype=unspecified hinzu in die Verbindungszeichenfolge, wie in JDBC-Verbindungsparameter erklärt. Dadurch kann Postgres den Typ auf der rechten Seite erraten und alles angemessen konvertieren, da es so etwas wie „enum =unknown“ erhält, was ein Ausdruck ist, mit dem es bereits weiß, was es tun soll (feed den ?-Wert an den Links-Typ-Deserialisierer). Dies ist die bevorzugte Option wie es für alle einfachen UDTs wie Enums auf einmal funktionieren sollte.

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

Oder:

  1. Erstellen Sie eine implizite Konvertierung von varchar in die Aufzählung in der Datenbank. In diesem zweiten Fall erhält die Datenbank also eine Zuweisung oder einen Vergleich wie 'enum =varchar' und findet in ihrem internen Katalog eine Regel, die besagt, dass sie den Wert auf der rechten Seite durch die Serialisierungsfunktion von varchar gefolgt von der Deserialisierungsfunktion von übergeben kann Aufzählung. Das sind mehr Schritte, als benötigt werden sollten; und zu viele implizite Umwandlungen im Katalog können dazu führen, dass beliebige Abfragen mehrdeutige Interpretationen haben, also gehen Sie sparsam damit um. Die Besetzungserstellung ist:

    CAST ERSTELLEN (CHARAKTER VARIIEREN als Stimmung) MIT INOUT ALS IMPLIZIT;

Sollte damit funktionieren.