首页 > 解决方案 > Spring JPA H2 和 DB2 如何指定表模式以在两个数据库上工作

问题描述

我正在创建一个 Springboot 应用程序,我计划与用于生产的 DB2 数据库和用于开发环境的 H2 数据库通信,我使用 spring application.profiles 设置了该应用程序。

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

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

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

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

但是,我遇到了以下问题:

  1. 如果我的实体用 注释@Table(name = "MY_SCHEMA.CAR"),我得到 DB2 error error com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-551, SQLSTATE=42501, SQLERRMC=MY_USER;CREATE TABLE FOR USER MY_SCHEMA;MY_SCHEMA.CAR , 驱动程序=4.29.24。在 H2 上,这将创建表 MY_SCHEMA.CAR。
  2. 如果我的实体用 注释@Table(name = "CAR", schema = "MY_SCHEMA"),它适用于 DB2,但在 H2 上,我得到错误 org.h2.jdbc.JdbcSQLSyntaxErrorException: Schema "MY_SCHEMA" not found; SQL 语句:创建表 MY_SCHEMA.CAR (...

如何解决上面 #2 中的问题以使其也能在我的 H2 数据库上运行?

标签: spring-bootspring-data-jpadb2h2database-schema

解决方案


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

为此,请删除 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

推荐阅读