【问题标题】:Unit testing Hibernate with multiple database catalogs使用多个数据库目录对 Hibernate 进行单元测试
【发布时间】:2012-05-06 06:22:41
【问题描述】:

我在测试查询多个目录/模式的 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 {
}

这一切都在应用程序中正常工作,没有任何问题。但是,当进行单元测试时,我通常的策略是使用 HSQL,并将 hibernate 的 ddl 标志设置为 auto 并让 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 时似乎没有观察到这些覆盖被执行,即我得到与上面相同的错误。

基本上,然后我想运行我现有的测试,或者以某种方式创建在映射中定义的表,或者以某种方式覆盖实体级别的目录/模式定义。

我想不出任何方法来达到这两种结果。有什么想法吗?

【问题讨论】:

  • 我在这里也面临同样的问题。你有什么结论吗?你最后做了什么?谢谢!

标签: java hibernate testing schema dbunit


【解决方案1】:

我设法通过 IGNORE_CATALOGS 属性和版本 1.4.200 在 H2 中实现了类似的功能

但是,他们文档中的 url 示例似乎对我不起作用,因此我在 schema.xml 中添加了一条语句: SET IGNORE_CATALOGS = true;

【讨论】:

    【解决方案2】:

    我相信H2 支持目录。我自己没有在其中使用过它们,但是Information Schema 中有一个 CATALOGS 表。

    【讨论】:

    • 试试 H2。映射中指定的目录用作模式。 DDL 执行引发了未找到模式的异常。因此添加了一些自定义 DDL 以在 Hibernate DDL 执行之前创建模式。映射(dbo)中定义的架构仍然存在问题,因此暂时将其设置为空白。现在希望这可以工作,但是即使创建模式正确执行(CREATE SCHEMA corp_ref_db AUTHORIZATION sa),创建表语句仍然失败?未找到架构“CORP_REF_DB”;
    • 区分大小写?有点长镜头,但我在 SQL Server 中遇到了问题,具体取决于配置。
    • 我试过大写和小写都没有成功。今天会再玩一次,看看我能不能成功。
    • @AlanHay 你能在生产和测试中使用不同的配置吗?如果是这样,我相信有一种方法可以避免在 HSQL(或 H2)中使用模式/目录。
    • @sharakan 你有什么想法?我面临同样的问题,我可以使用不同的配置进行生产和测试。 :)
    猜你喜欢
    • 2011-04-08
    • 2017-04-05
    • 1970-01-01
    • 2011-11-17
    • 2019-11-15
    • 2019-04-01
    • 1970-01-01
    • 2016-07-17
    • 2010-09-07
    相关资源
    最近更新 更多