Spring JPA H2 和 DB2 如何指定 table 模式以在两个数据库上工作

Spring JPA H2 and DB2 How to specify table schema to work on both databases

我正在创建一个 Springboot 应用程序,我计划在生产环境中与 DB2 数据库对话,在我使用 spring application.profiles.

设置的开发环境中与 H2 数据库对话

我的 application.properties 文件也有设置:

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

,如果设置,将不会替换“.”使用“_”(如 MY_SCHEMA.CARMY_SCHEMA_CAR)。

我需要这个,因为在 DB2 上,我必须在 table 前面加上像 SELECT * FROM MY_SCHEMA.CAR 这样的模式。在 H2 控制台中,这不是必需的,我可以做 SELECT * FROM CAR.

但是,我 运行 遇到以下问题:

  1. 如果我的实体用 @Table(name = "MY_SCHEMA.CAR") 注释,我会收到 DB2 错误 错误com.ibm.db2.jcc.am.SqlSyntaxErrorException:DB2 SQL错误: SQLCODE=-551,SQLSTATE=42501,SQLERRMC=MY_USER;为用户创建 TABLE MY_SCHEMA;MY_SCHEMA.CAR,驱动程序=4.29.24。在 H2 上,这会创建 table MY_SCHEMA.CAR.
  2. 如果我的实体用 @Table(name = "CAR", schema = "MY_SCHEMA") 注释,它适用于 DB2 但在 H2 上,我得到错误 org.h2.jdbc.JdbcSQLSyntaxErrorException:模式“MY_SCHEMA”不 成立; SQL 语句:创建 table MY_SCHEMA.CAR (...

如何解决上面 #2 中的问题,让它也能在我的 H2 数据库上运行?

一般来说,我不喜欢在应用程序中对默认架构进行硬编码。如果架构因任何原因发生更改,应用程序不需要受到影响。

为此,请删除 SpringBoot 应用程序上的架构。不过,您需要更改 JDBC 连接 URL。附加 :currentSchema=MY_SCHEMA; 以设置默认架构。

例如,在我的沙箱中连接到 DB2 时,我使用:

jdbc:db2://192.168.56.218:50000/empusa:currentSchema=ECOS;

H2 提供了类似的功能。当我连接到我的 H2 数据库时,我使用:

jdbc:h2:tcp://localhost/~/test;SCHEMA=ECOS