一个 H2 实例上的 2 个数据库

2 databases on the one H2 instance

我有 JPA 存储库和 @Query,它连接来自位于同一服务器上的其他数据库的表。

SELECT id,co.name from Agenc a inner join[other_db_mame].[schema_name].[table_name] co ..... 

我想编写集成测试来覆盖此查询的流程。 在集成测试中,我使用 H2 DB 我的问题是,如何正确配置 H2 DB 以拥有 2 个 DB 并使此查询有效? 也许有办法,通过脚本创建另一个数据库,或者像这样?

H2 一次只支持直接访问一个数据库,但您可以从其他数据库创建 linked tables 到 tables。

要创建 linked table,您可以使用 CREATE LINKED TABLE 命令: https://h2database.com/html/commands.html#create_linked_table

CREATE LINKED TABLE targetTableName('', 'jdbcURL', 'username', 'password', 'sourceTableName');

您还可以 link 使用 LINK_SCHEMA 函数的整个架构: https://h2database.com/html/functions.html#link_schema

CALL LINK_SCHEMA('targetSchemaName', '', 'jdbcURL', 'username', 'password', 'sourceSchemaName');

请注意,H2(以及 SQL 标准)中 fully-qualified table 名称的格式为 catalogName.schemaName.tableName。 H2 只支持一个目录(名称与数据库名称相同),不能定义额外的目录。 Non-standard -H2 不接受 [identifier] 的语法,除非您使用 MSSQLServer 兼容模式。在这种模式下,您可以使用该语法,但无论如何您都不能有不同的目录名称,因此如果它们在您的应用程序中是固定的,就会有问题。

如果IGNORE_CATALOGS设置为TRUE,实际上H2可以忽略指定的目录名称: https://h2database.com/html/commands.html#set_ignore_catalogs

SET IGNORE_CATALOGS TRUE;

但是如果架构和 table 名称的组合在您的原始配置中不是唯一的,则与 H2 无关。您不能以任何方式在 H2 中创建具有相同架构和 table 名称的不同 table。