【问题标题】:Spring Boot Error executing DDL drop schema via JDBC Statement通过 JDBC 语句执行 DDL 删除模式的 Spring Boot 错误
【发布时间】:2021-10-21 06:20:56
【问题描述】:

最终,我的应用程序会做我想做的事。启动时,它使用我指定为默认模式的名称创建模式,并创建我的表。在关闭时,它会删除表,然后删除模式。这一切都很好。

但是启动时出现错误,然后又恢复了。
在启动时,首先它会为我的表drop table if exists,并且效果很好。
然后它会删除模式“myschema”,这会导致此错误:

通过 JDBC 语句执行 DDL “drop schema “myschema””时出错
引起:org.postgresql.util.PSQLException:错误:模式“myschema”不存在

真的希望它不要那样做,拜托。即使它最终会恢复。
它能够做到“如果存在则删除表”,那么为什么不能以同样的方式“删除模式”呢?

我指定架构名称的唯一位置是在我的 application.properties 文件中。以下是我设置的一些属性:

logging.level.org.hibernate.SQL = DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder = TRACE
    
spring.datasource.driver-class-name = org.postgresql.Driver

spring.jpa.hibernate.ddl-auto = create-drop
spring.jpa.open-in-view = false
spring.jpa.properties.hibernate.default_schema = "myschema"
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.hbm2dll.create_namespaces = true

spring.jpa.show-sql = true

版本:
Spring Boot 2.5.3
Java 14
Postgresql jdbc 驱动 42.2.23
Postgresql 数据库 11.4
Maven 3.8.1(嵌入在 Eclipse 2021-06 中)

【问题讨论】:

    标签: java spring postgresql spring-boot hibernate


    【解决方案1】:

    您通常可以忽略这些错误,因为放置阶段的错误通常也会被 Hibernate 忽略。我建议您根本不要使用create-drop,因为这仅对“开发”有意义。我猜你不想放弃你的生产表;)

    【讨论】:

      【解决方案2】:

      这是我解决这个问题的方法。

      我已经在我的项目中使用了自定义 PostgreSQL 方言。它在扩展org.hibernate.dialect.PostgreSQL10Dialect 的类中定义。所以我只是为getDropSchemaCommand(String schemaName) 添加了一个方法覆盖,并让它返回一个以“drop schema if exists”而不是“drop schema”开头的字符串。

      必须在 application.properties 文件中指定自定义方言,使用 spring.jpa.properties.hibernate.dialect

      【讨论】:

        猜你喜欢
        • 2021-01-08
        • 1970-01-01
        • 1970-01-01
        • 2019-03-30
        • 1970-01-01
        • 1970-01-01
        • 2017-10-20
        • 2017-08-28
        • 2022-09-29
        相关资源
        最近更新 更多