当为Postgres数据库的属性spring.jpa.hibernate.ddl-Auto提供更新值时,Hibernate不会生成序列

zynd9foi  于 2022-11-14  发布在  Spring
关注(0)|答案(3)|浏览(168)

当我使用spring.jpa.hibernate.ddl-Auto=Create时,序列和表都会被创建,但是当这个属性设置为UPDATE时,只会创建表。我已经创建了一个Spring引导应用程序,并且对于DB,我使用的是postgres。但是,当我检查h2数据库(它是嵌入的)时,也为更新值创建了序列和表。我无法将属性设置为Create,因为它将在应用程序重新启动时删除表。有谁能给我开导一下吗?先谢谢你。

e0bqpujr

e0bqpujr2#

Hibernate中有一个与Postgres方言相关的错误。以下是PostgresSQLDialect中用于检查模式中是否存在序列的方法(顺便说一句,这是错误的):

@Override
    public String getQuerySequencesString() {
        return "select relname from pg_class where relkind='S'";
    }

如果数据库中的任何模式中存在任何序列,则上述查询将返回序列。如果有任何模式包含任何序列,则不会在该数据库的指定模式中创建序列。为了解决这个问题,我编写了一个定制的Postgres方言,并将查询更改为以下内容:

@Override
public String getQuerySequencesString() {
    return "select sequencename from pg_catalog.pg_sequences where schemaname='"+schemaName+"'";
}

它解决了DDL-AUTO设置为UPDATE时的问题。现在正在创建序列。

4bbkushb

4bbkushb3#

对任何感兴趣的人来说:
Hibernate检查所有包含hibernate_sequence的表。但是,它只需要在PostgreSQL上检查currentSchema。刚刚更改了对Mashish091的解决方案的查询。

return "select * from information_schema.sequences where sequence_schema ='" + schemaName + "'";

相关问题