sql >> Database >  >> RDS >> PostgreSQL

Java Enums, JPA en Postgres Enums - Hoe laat ik ze samenwerken?

Ik heb eigenlijk een eenvoudigere manier gebruikt dan die met PGObject en Converters. Aangezien in Postgres opsommingen vrij natuurlijk van tekst worden omgezet, hoeft u het alleen maar te laten doen waar het goed in is. Ik zal Arjan's voorbeeld van stemmingen lenen, als hij het niet erg vindt:

Het opsommingstype in Postgres:

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

De klasse en opsomming in Java:

public @Entity class Person {

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

  @Enumerated(EnumType.STRING)
  Mood mood;

}

Die @Enumerated-tag zegt dat serialisatie/deserialisatie van de opsomming in tekst moet worden gedaan. Zonder dit gebruikt het int, wat lastiger is dan wat dan ook.

Op dit punt heb je twee opties. U ofwel:

  1. stringtype=unspecified toevoegen aan de verbindingsreeks, zoals uitgelegd in JDBC-verbindingsparameters. Hierdoor kan Postgres het type aan de rechterkant raden en alles adequaat converteren, aangezien het zoiets als 'enum =onbekend' ontvangt, wat een uitdrukking is waarmee het al weet wat het moet doen (feed de ?-waarde aan de linker type deserializer). Dit is de voorkeursoptie, zoals het zou moeten werken voor alle eenvoudige UDT's zoals opsommingen in één keer.

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

Of:

  1. Maak een impliciete conversie van varchar naar de enum in de database. Dus in dit tweede geval krijgt de database een toewijzing of vergelijking zoals 'enum =varchar' en vindt een regel in de interne catalogus die zegt dat het de rechterwaarde kan doorgeven via de serialisatiefunctie van varchar gevolgd door de deserialisatiefunctie van de opsomming. Dat zijn meer stappen dan nodig zijn; en het hebben van te veel impliciete casts in de catalogus kan ertoe leiden dat willekeurige zoekopdrachten dubbelzinnige interpretaties hebben, dus gebruik het spaarzaam. De cast-creatie is:

    CREER CAST (KARAKTER VARIANT als stemming) MET INOUT ALS IMPLICIET;

Zou daarmee moeten werken.



  1. MAAK TABEL MySQL versus T-SQL met syntaxisvoorbeelden

  2. TSQL - Kolom toevoegen aan alle tabellen in een database [ Cursorvoorbeeld]

  3. SQL Server 2008 Windows Auth Login Error:De login is van een niet-vertrouwd domein

  4. Hoe WordPress-beheerderswachtwoord opnieuw in te stellen via de MySQL-opdrachtprompt