db2与h2和oracle的架构问题,架构始终是PUBLIC

时间:2014-11-27 14:45:34

标签: oracle database-schema h2 dbunit in-memory-database

从以前导出的Oracle DB中,我同时拥有包含大量数据的xml和dtd文件,但是当我尝试导入数据时,dbunit似乎忽略了dtdfiles。

flatXMLBuilder.build(xmlFile);

在尝试引用表的一个对象时,我总是会收到此错误消息:

ERROR Table 'TABLE' not found in tableMap=org.dbunit.dataset.OrderedTableNameMap

和警告:

WARN  session=global o.d.database.DatabaseConnection - The given schema 'SA' does not exist

我不确定dtd文件的包含是否会修复schemaproblem(总是设置为PUBLIC) 但如果我至少可以测试它,我会很高兴。 这些文件始终位于同一目录中:

T1.xml
T1.dtd

同样核心问题似乎是在内存db中我的目标H2上总是设置为PUBLIC的模式。 我在连接url中尝试了一些模式集方法,如“set schema”或“init = create schema”,但currentchema始终是公开的。

因此,当我以SA用户身份登录时,例如我找不到任何表,因为SA模式中只有PUBLIC中没有表。

我也尝试了h2connection上的setSchema(String)方法,但它不起作用(我在调用时遇到无法捕获的错误)

更新: 目前我使用FileInputStream来读取dtd文件并将其添加到构建器:

builder.setMetaDataSetFromDtd(dtdStream);

但它没有帮助解决这个问题。

1 个答案:

答案 0 :(得分:2)

如果要创建架构x,并在数据库URL中将默认架构设置为x,则需要使用:

jdbc:h2:~/data/databaseName;init=create schema if not exists x\;set schema x

请注意转义的分号。在Java中,您还需要转义反斜杠:

String url = "jdbc:h2:~/data/databaseName;init=create schema if not exists x\\;set schema x";

此网址有点长。您可能希望将所有语句移动到init脚本,然后运行:

jdbc:h2:~/data/databaseName;init=runscript 'init.sql'