sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLのシードファイルを使用する場合のJPAの例外

    問題は構文ではありませんでした。構文はflywayで完全に機能していたか、PostgreSQLCLIで直接機能していたためです。問題はHibernateにあり、特にインポートファイルの解析にありました。 Hibernateが機能する方法は、コンテンツ全体を単一の式としてではなく、ファイルから各式を個別に実行することです。すべての関数定義を1行にまとめようとしましたが、機能しましたが、読み取れませんでした。そのため、式を複数行にすることができることをHibernateに通知するための構成があることがわかりましたが、$$ 複数行で使用した場合、区切り文字はまだ認識されませんでした。

    したがって、解決策は'を使用してコマンドを定義することでした。 区切り文字を入力し、必要に応じて追加の'で一重引用符をエスケープします 。

    解決策は、spring.jpa.properties.hibernate.hbm2ddl.import_files_sql_extractorを設定することです。 org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractorを使用するには 。 MultipleLinesSqlCommandExtractorは、複数の行からSQL式を抽出し、セミコロンが存在する場合に停止します。これで式は終わりです。関数の本体を一重引用符で囲む文字列でラップすることにより、Hibernateはそのラップを1行として扱います。

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

    式の単一引用符をエスケープすることを常に念頭に置く必要がありますが、今ではより人間が読めるシードファイルを作成できます。




    1. SQL Server 2008:ユーザー名に特権を付与するにはどうすればよいですか?

    2. OracleSQLDeveloper-ドロップされたテーブルをリカバリする方法

    3. TSQLでnull以外の主キーを使用するのはなぜですか?

    4. INNER JOIN状態で「OR」を使用するのは悪い考えですか?