spring-boot - 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.CAR
用MY_SCHEMA_CAR
)。
我需要这个,因为在 DB2 上,我必须在表前加上SELECT * FROM MY_SCHEMA.CAR
. 在 H2 控制台中,这不是必需的,我可以做SELECT * FROM CAR
.
但是,我遇到了以下问题:
- 如果我的实体用 注释
@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。 - 如果我的实体用 注释
@Table(name = "CAR", schema = "MY_SCHEMA")
,它适用于 DB2,但在 H2 上,我得到错误 org.h2.jdbc.JdbcSQLSyntaxErrorException: Schema "MY_SCHEMA" not found; SQL 语句:创建表 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
推荐阅读
- c# - 最大系列产品
- ruby - Ruby on Rails 中的 class: 'item' 和 :class => "item" 有什么区别?我应该使用哪种风格?
- com - 在卸载过程中删除补丁中添加的新文件 - 即使标记为永久
- reactjs - 新手反应问题:从html调用反应时目标容器不是DOM元素
- java - 用另一个类中产生的元素填充 Java 数组
- python - 如何让 pdb.trace() 在 unittest 中工作?
- scala - Scala 无法解决复杂生成代码中的类型不匹配问题
- django - 在 Django 模板中计算 2 个查询集
- python - MuZero 的伪代码中的奖励值是否错位?
- python - 通过引用问题传递函数的参数