使用多个数据库目录单元测试Hibernate

4

我在测试一个查询多个目录/模式的Hibernate应用程序时遇到了问题。

生产数据库是Sybase,在除了映射到默认目录/模式的实体之外,还有两个实体映射如下。因此,总共有三个目录。

@Table(catalog = "corp_ref_db", schema = "dbo", name = "WORKFORCE_V2")
public class EmployeeRecord implements Serializable {
}

@Table(catalog = "reference", schema = "dbo", name="cntry")
public class Country implements Serializable {
}

在应用程序中,所有这些都可以正常运行,没有任何问题。然而,在单元测试时,我的一般策略是使用带有hibernate ddl标志设置为auto的HSQL,并让dbunit填充表格。

当所有表都在同一个模式中时,一切都运行良好。

然而,自从添加了这些额外的表格之后,测试就坏了,因为DDL不会运行,因为HSQL只支持一个目录。

create table corp_ref_db.dbo.WORKFORCE_V2
user lacks privilege or object not found: CORP_REF_DB

如果只有两个目录,那么可能可以通过在 HSQL 数据库中显式地将默认目录和模式更改为所定义的目录来解决这个问题。
是否有其他内存数据库可以使用此方法,或者是否有任何策略可以让测试在 HSQL 中运行。
我考虑提供一个 orm.xml 文件,指定默认目录和模式(覆盖任何注释并在默认目录/模式中创建所有定义的表),但是在执行 DDL 时似乎没有遵守这些覆盖,即我得到与上面相同的错误。
因此,我希望能够运行现有的测试,并以某种方式创建按照映射定义的表,或者以某种方式在实体级别覆盖目录/模式定义。
我无法想出任何实现这两个结果的方法。有什么想法吗?

我在这里遇到了同样的问题。你得出了任何结论吗?你最终做了什么?谢谢! - Elias Dorneles
2个回答

0

我通过 IGNORE_CATALOGS 属性和版本 1.4.200 在 H2 中实现了类似于这样的功能。

然而,他们文档中的 URL 示例似乎对我无效,因此我在我的 schema.xml 文件中添加了一条语句:SET IGNORE_CATALOGS = true;


0

我相信H2支持目录。虽然我自己没有在其中使用过,但是信息模式中有一个CATALOGS表。


我已经尝试了大小写,但没有成功。今天我会再试一下,看看能否有所进展。 - Alan Hay
@AlanHay 你能在生产环境和测试环境中使用不同的配置吗?如果可以,我相信有一种方法可以避免在 HSQL(或 H2)中使用模式/目录。 - sharakan
@sharakan,你有什么想法吗?我也遇到了同样的问题,但我可以为生产和测试使用不同的配置。 :) - Elias Dorneles
@eljunior 老实说,我完全不记得我的另一个想法是什么了。但我刚刚注意到这个关于NamingStrategy的答案(https://dev59.com/LW855IYBdhLWcg3wfUZM),你可以使用它有条件地将目录/模式前缀添加到表名上。 - sharakan
@sharakan 谢谢,好知道!我已经使用自定义 orm.xml 文件解决了我的问题,以覆盖单元测试的目录名称。 - Elias Dorneles
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接