在 H2 非默认模式中找不到带有 activeJDBC 的表

Can't find tables with activeJDBC in H2 non-default schema

在我的集成测试中,我正在创建一个具有两个模式的 H2 数据库,ABA 被设置为默认模式,就像它是 运行 PostgreSQL 数据库时应用程序的正常设置一样。在集成测试期间,我启动了 H2 数据库和嵌入式 Tomcat 服务器并执行 SQL 文件以通过 Liquibase 初始化数据库。

连接到模式 A 中的 table 的所有模型都用 @Table("tablename") 注释,而模式 B 的模型用 @Table("B.tablename") 注释.当我在嵌入式服务器中调用 REST 端点时,activeJDBC 警告我:

WARN  org.javalite.activejdbc.Registry - Failed to retrieve metadata for table: 'B.tablename'. Are you sure this table exists? For some databases table names are case sensitive.

然后,当我尝试在我的 Java 代码中访问模式 B 中的 table 时,activeJDBC 抛出以下异常(在上一个警告之后是预期的):

org.javalite.activejdbc.InitException: Failed to find table: B.tablename
  at org.javalite.activejdbc.MetaModel.getAttributeNames(MetaModel.java:248)
  at org.javalite.activejdbc.Model.hydrate(Model.java:207)
  at org.javalite.activejdbc.ModelDelegate.instance(ModelDelegate.java:247)
  at org.javalite.activejdbc.ModelDelegate.instance(ModelDelegate.java:241)
  ...

访问架构 A 中的 table 按预期工作。

我确信模式 B 中的 tables 实际上已经创建并包含数据,因为在用于执行文件的 Liquibase 日志条目之上,我还可以直接访问数据库并获取结果 table 内容:

数据库和服务器初始化:

private String H2_CONNECTION_STRING = "jdbc:h2:mem:testdb;INIT=CREATE SCHEMA IF NOT EXISTS A\;SET SCHEMA A\;CREATE SCHEMA IF NOT EXISTS B\;";

@Before
public void initializeDatabase() {
    connection = DriverManager.getConnection(H2_CONNECTION_STRING);
    Statement stat = connection.createStatement();
    stat.execute("GRANT ALTER ANY SCHEMA TO PUBLIC");
    LiquibaseInitialisation.initH2(H2_CONNECTION_STRING); // execute SQL scripts
    EmbeddedServer.startServer();
}

打印B.tablename内容的查询:

Logger Log = LoggerFactory.getLogger("test");

Statement stat = connection.createStatement(); 
stat.execute("SELECT * FROM B.tablename;");
connection.commit();

resultSet = stat4.getResultSet();
rsmd = resultSet.getMetaData();
columnsNumber = rsmd.getColumnCount();

while (resultSet.next()) {
    builder = new StringBuilder();
    for (int i = 1; i <= columnsNumber; i++) {
        builder.append(resultSet.getString(i));
        builder.append(" ");
    }
    Log.info(builder.toString());
}

这会生成 B.tablename.

内容的所需输出

问题是:为什么 activeJDBC 找不到 H2 数据库中模式 B 中的 table,而它在 PostgreSQL 中却完美无缺?关于 H2 或 activeJDBC 中的模式,我是否遗漏了什么?

请将此记录为问题:https://github.com/javalite/activejdbc/issues 并提供复制此情况的完整说明。最好能提供一个小项目。