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

Ausnahme in JPA bei Verwendung der Seed-Datei für PostgreSQL

Das Problem war nicht die Syntax, denn die Syntax funktionierte perfekt mit Flyway oder direkt in der PostgreSQL-CLI. Das Problem war mit Hibernate, speziell mit dem Parsen der Importdatei. Hibernate funktioniert so, dass es jeden Ausdruck aus den Dateien einzeln ausführt, nicht den gesamten Inhalt als einen einzigen Ausdruck. Ich habe versucht, alle Funktionsdefinitionen in eine Zeile zu schreiben, und es hat funktioniert, aber es war nicht lesbar. Also habe ich festgestellt, dass es eine Konfiguration für Hibernate gibt, die ihm mitteilt, dass Ausdrücke mehrzeilig sein können, aber der $$ Trennzeichen wurde bei mehrzeiliger Verwendung immer noch nicht erkannt.

Die Lösung bestand also darin, den Befehl mit ' zu definieren Trennzeichen und maskieren Sie dann die einfachen Anführungszeichen, wo nötig, mit einem zusätzlichen ' .

Die Lösung besteht darin, den spring.jpa.properties.hibernate.hbm2ddl.import_files_sql_extractor festzulegen um org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor zu verwenden . MultipleLinesSqlCommandExtractor extrahiert den SQL-Ausdruck aus mehreren Zeilen und stoppt, wenn ein Semikolon vorhanden ist. Das ist das Ende des Ausdrucks. Indem der Hauptteil der Funktion in eine Zeichenfolge mit einfachen Anführungszeichen eingeschlossen wird, behandelt Hibernate diese Umhüllung als eine einzelne Zeile.

data.sql

CREATE OR REPLACE FUNCTION insert_timeout_configuration() RETURNS bigint AS '
  DECLARE created_id bigint;

  BEGIN
    INSERT INTO timeout_configuration (id, version, timeout)
    VALUES (nextval(''my_sequence''), 0, 300)
    RETURNING id INTO created_id;
    return created_id;
  END;
' language plpgsql;

CREATE OR REPLACE FUNCTION insert_url_configuration() RETURNS bigint AS '
  DECLARE created_id bigint;

  BEGIN
    INSERT INTO url_configuration (id, version, my_url)
    VALUES (nextval(''my_sequence''), 0,''http://localhost:8080/'')
    RETURNING id INTO created_id;
    return created_id;
  END;
' language plpgsql;

DO '
      INSERT INTO global_configuration(id, version, name, timeout_configuration_id, url_configuration_id)
      VALUES (nextval(''my_sequence''), 0, ''My global config'', insert_timeout_configuration(), insert_url_configuration());

-- do some other code 
END
';
drop function insert_timeout_configuration();
drop function insert_url_configuration();

Ich muss immer daran denken, die einfachen Anführungszeichen in den Ausdrücken zu umgehen, aber jetzt kann ich eine besser lesbare Seed-Datei haben.