在我的集成测试中,我创建了一个H2数据库,其中包含两个模式A
和B
。 A
被设置为默认架构,就像它在运行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中遗漏了关于模式的内容吗?
答案 0 :(得分:1)
请将此问题记录为问题:https://github.com/javalite/activejdbc/issues并提供复制此条件的完整说明。最好的,如果你可以提供一个小项目。