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

Undtagelse i JPA ved brug af seed-fil til PostgreSQL

Problemet var ikke syntaksen, fordi syntaksen fungerede perfekt med flyway eller direkte i PostgreSQL CLI. Problemet var med Hibernate, specifikt med at analysere importfilen. Måden Hibernate fungerer på er, at det udfører hvert udtryk fra filerne individuelt, ikke hele indholdet som et enkelt udtryk. Jeg forsøgte at sætte alle funktionsdefinitioner på én linje, og det virkede, men det var ikke læsbart. Så jeg fandt ud af, at der er en konfiguration til Hibernate for at fortælle det, at udtryk kan være flerlinjede, men $$ skilletegn var stadig ikke genkendt, når det blev brugt i multi-line.

Så løsningen var at definere kommandoen med ' skilletegn og undslippe de enkelte anførselstegn, hvor det er nødvendigt med en ekstra ' .

Løsningen er at indstille spring.jpa.properties.hibernate.hbm2ddl.import_files_sql_extractor at bruge org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor . MultipleLinesSqlCommandExtractor udtrækker SQL-udtrykket fra flere linjer og stopper, når der er et semikolon. Det er slutningen på udtrykket. Ved at ombryde funktionens brødtekst i en streng med et anførselstegn, vil Hibernate behandle denne ombrydning som en enkelt linje.

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();

Jeg skal altid huske på for at undslippe de enkelte anførselstegn i udtrykkene, men nu kan jeg have en mere menneskelig læsbar seed-fil.




  1. SQL Server:Isolationsniveau lækker på tværs af poolede forbindelser

  2. Sådan udføres en lagret procedure i C#-programmet

  3. hvad der sker i cutover-fasen af ​​adop i R12,2

  4. Opretter forbindelse til SQL Server 2012 ved hjælp af sqlalchemy og pyodbc