当为 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 类型数据