在H2非默认架构中找不到具有activeJDBC的表

时间:2018-04-10 12:30:24

标签: h2 database-schema activejdbc

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

所有与模式A中的表相关联的模型都使用@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中的表时,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中的表可以正常工作。

我确信架构B中的表实际上是创建并包含数据,因为除了用于执行文件的Liquibase日志条目之外,我还可以直接访问数据库并获取表内容:

数据库和服务器的初始化:

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中找不到表格,但在PostgreSQL中可以完美运行?我在H2或activeJDBC中遗漏了关于模式的内容吗?

1 个答案:

答案 0 :(得分:1)

请将此问题记录为问题:https://github.com/javalite/activejdbc/issues并提供复制此条件的完整说明。最好的,如果你可以提供一个小项目。