PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Java Enums, JPA и Postgres enums - Как да ги накарам да работят заедно?

Всъщност използвах по-прост начин от този с PGObject и конвертори. Тъй като в Postgres изброяванията се преобразуват съвсем естествено в текст, просто трябва да го оставите да прави това, което прави най-добре. Ще взема назаем примера за настроения на Арджан, ако той няма нищо против:

Типът enum в Postgres:

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

Класът и enum в Java:

public @Entity class Person {

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

  @Enumerated(EnumType.STRING)
  Mood mood;

}

Този @Enumerated таг казва, че сериализацията/десериализацията на изброяването трябва да се извърши в текст. Без него той използва int, което е по-обезпокоително от всичко.

В този момент имате две възможности. Вие или:

  1. Добавете stringtype=unspecified към низа за свързване, както е обяснено в параметрите на връзката на JDBC. Това позволява на Postgres да отгатне типа от дясната страна и да преобразува всичко по подходящ начин, тъй като получава нещо като 'enum =unknown', което е израз, с който вече знае какво да прави (feed стойността ? за десериализатор от ляв тип). Това е предпочитаната опция, тъй като би трябвало да работи за всички прости UDT, като например enums наведнъж.

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

Или:

  1. Създайте имплицитно преобразуване от varchar към enum в базата данни. Така че в този втори случай базата данни получава някакво присвояване или сравнение като 'enum =varchar' и намира правило във вътрешния си каталог, което казва, че може да предаде дясната стойност през функцията за сериализиране на varchar, последвана от функцията за десериализация на enum. Това са повече стъпки, отколкото би трябвало да са необходими; и наличието на твърде много имплицитни прехвърляния в каталога може да доведе до двусмислени интерпретации на произволни заявки, така че го използвайте пестеливо. Създаването на каста е:

    СЪЗДАВАЙТЕ ИЗПЪЛНЕНИЕ (ХАРАКТЪТ СЕ РАЗЛИЧИ в зависимост от настроението) С INOUT КАТО НЯКВАЩО;

Трябва да работи само с това.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Вмъкване при дублирана актуализация в PostgreSQL?

  2. Търсене на пълен текст в Postgres или CouchDB?

  3. Индексирано ORDER BY с LIMIT 1

  4. Условна функция за извеждане/закъснение PostgreSQL?

  5. правилна анотация за хибернация за байт[]