繁体   English   中英

通过 JDBC 语句执行 DDL 删除模式的 Spring Boot 错误

[英]Spring Boot Error executing DDL drop schema via JDBC Statement

最终,我的应用程序确实按照我的意愿行事。 在启动时,它使用我指定为默认架构的名称创建架构,并创建我的表。 在关闭时,它会删除表,然后删除模式。 这一切都很好。

但是启动的时候报错,然后就恢复了。
在启动时,首先它会删除表(如果我的表存在) ,并且工作正常。
然后它确实删除架构 "myschema" ,这会导致此错误:

通过 JDBC 语句执行 DDL“删除模式“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

版本:
春季启动 2.5.3
爪哇 14
Postgresql jdbc 驱动程序 42.2.23
PostgreSQL 数据库 11.4
Maven 3.8.1(嵌入在 Eclipse 2021-06 中)

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM