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

Posted

技术标签:

【中文标题】当为 Postgres DB 的属性 spring.jpa.hibernate.ddl-auto 提供更新值时,Hibernate 不会生成序列【英文标题】:Hibernate does not generate sequences when update value is provided to the property spring.jpa.hibernate.ddl-auto for Postgres DBs 【发布时间】:2020-04-11 19:31:38 【问题描述】:

当我使用 spring.jpa.hibernate.ddl-auto=create 时,会同时创建序列和表,但是当此属性设置为更新时,只会创建表。我已经创建了一个 Spring Boot 应用程序,对于 DB,我正在使用 Postgres。但是当我为 h2 数据库(嵌入的)检查相同的内容时,也会为更新值创建序列和表。我无法设置要创建的属性,因为它会在应用程序重新启动时删除表。有人可以启发我吗? 提前致谢。

【问题讨论】:

【参考方案1】:

您可以在 spring 文档中阅读有关 ddl-auto-generation 的信息

链接:https://docs.spring.io/spring-boot/docs/1.0.x-SNAPSHOT/reference/html/howto-database-initialization.html

或者

https://www.baeldung.com/spring-boot-data-sql-and-schema-sql

【讨论】:

【参考方案2】:

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 设置为更新时的问题。现在正在创建序列。

【讨论】:

以上是关于当为 Postgres DB 的属性 spring.jpa.hibernate.ddl-auto 提供更新值时,Hibernate 不会生成序列的主要内容,如果未能解决你的问题,请参考以下文章

docker-compose:spring-boot web 服务访问 postgres db 服务

我正在尝试将我的本地 spring boot 应用程序连接到我的 heroku postgres db

无法通过 Spring Boot 将 Docker Desktop Kubernetes (Windows) 服务连接到本地 Postgres db

java 8 到 java 11 迁移后使用 postgres db 和 spring boot 保存 JpaSystemException 的 jsonb 类型数据

如何在 Spring Boot JPA 中按 Postgres 的 json 属性排序?

Laravel/Eloquent/DB 查询 - 当为空且不为空时加入