最近我已經將H2我們SpringBoot 2.5.8專案中的資料庫從版本升級1.4.200到2.0.204. 它僅用于測驗目的。對于生產,我們使用PostgreSQL 12.9. 似乎升級后一些詞成為H2資料庫中的關鍵字,例如:day, value. 呼叫集成測驗后部分Hibernate失敗DDL。
- Postgres 12 - 關鍵字
- H2 - 關鍵字
這種情況的最佳解決方案是什么?
- 查看所有物體并在保留的列名稱周圍應用反引號:
@NotNull
@Column(name = "day", nullable = false)
private LocalDate day;
@NotNull
@Column(name = "`day`", nullable = false)
private LocalDate day;
- 僅為集成測驗目的提供專用
SpringPhysicalNamingStrategy和覆寫toPhysicalColumnName方法。檢查H2資料庫中保留關鍵字的串列并參考它們。
# Datasource related properties
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=sa
spring.sql.init.mode=always
spring.sql.init.continue-on-error=true
spring.sql.init.platform=h2
spring.jpa.show-sql=true
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.jdbc.time_zone=UTC
spring.jpa.hibernate.naming.physical-strategy=[project-related-package-name-here].strategy.CustomH2NamingStrategy
spring.jpa.defer-datasource-initialization=true
我認為第一個解決方案應該PostgreSQL與H2資料庫一起使用。盡管day識別符號是非保留的,PostgreSQL 12.9但它可能在未來的版本中。第二個應該解決H2資料庫的問題。
你怎么看?也許這種情況有更好的解決方案?或者也許從SQL:?2016標準中獲取保留關鍵字串列并通過自定義將它們應用于兩個資料庫SpringPhysicalNamingStrategy?
uj5u.com熱心網友回復:
在 H2 2.0 中,您可以通過附加到 JDBC URL來使用SET NON_KEYWORDS設定;NON_KEYWORDS=DAY,VALUE,但通常的解決方案是無條件地在生成的 SQL 中參考所有識別符號spring.jpa.properties.hibernate.globally_quoted_identifiers=true,例如。
;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE;DEFAULT_NULL_ORDERING=HIGH當您嘗試使用 H2 而不是 PostgreSQL 時,您通常也應該擁有H2 的 JDBC URL。但是在生產和測驗中使用不同的 DBMS 是個壞主意,而且 Hibernate ORM 還沒有完全支持 H2 2.0。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/406480.html
標籤:
