在 H2 非默认模式中找不到带有 activeJDBC 的表
Can't find tables with activeJDBC in H2 non-default schema
在我的集成测试中,我正在创建一个具有两个模式的 H2 数据库,A
和 B
。 A
被设置为默认模式,就像它是 运行 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 并提供复制此情况的完整说明。最好能提供一个小项目。
在我的集成测试中,我正在创建一个具有两个模式的 H2 数据库,A
和 B
。 A
被设置为默认模式,就像它是 运行 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 并提供复制此情况的完整说明。最好能提供一个小项目。