【问题标题】:How can I create an in-memory test database when the table mappings are using other databases?当表映射使用其他数据库时,如何创建内存测试数据库?
【发布时间】:2012-08-22 00:41:40
【问题描述】:

我正在尝试为使用 Spring 和 JPA(使用 Hibernate)的应用程序创建一些测试。

我想使用内存数据库,这样我就可以检查一切是否正常,而不必依赖主开发服务器(这是一个旧的 Sybase 安装),并且还可以让我更好地隔离测试功能.

问题是,有很多表使用@Table("dbname..dbo.someviewname") 映射以访问其他数据库的视图。 因此,我尝试将 HSQLDB 与 DBunit 一起使用,但可以理解的是,HSQLDB 不允许创建名称中带有点的表。

我该如何进行测试?

我是否应该放弃内存中的东西并使用主 Sybase 开发服务器进行测试(冒着毁掉其他开发人员的风险:P)?

【问题讨论】:

  • 在类中嵌入模式信息(表名/列名)通常是个坏主意(除非在应用程序的整个生命周期中只使用一个数据存储)。最好将它放在 orm.xml 中,并为您可能将应用程序部署到的每个数据存储区设置一个。
  • 好点!这是一个有很多表的遗留应用程序,让我们看看我能做些什么......

标签: spring hibernate jpa hsqldb dbunit


【解决方案1】:

dbname.dbo.someviewname HSQLDB 可能提取dbname 作为目录,dbo 作为架构,somewiewname 作为表名。

HSQLDB 允许创建名称中带有点的表。这可以通过将表名视为分隔标识符来完成:

@Table(name="\"dbname.dbo.someviewname\"")

但您不想使用它,因为 Sybase 的名称处理方式也发生了变化。如果您可以有单独的 orm.xml 进行测试,那么您可以在 orm.xml 中添加以下内容:

    <persistence-unit-defaults>
        <delimited-identifiers/>
    </persistence-unit-defaults>  

它使所有数据库对象名称都被视为分隔标识符。根据您的映射和查询,它最终可以工作,但很可能您会遇到一些问题。可能的最佳方法是不在映射中使用模式名称和/或在测试中使用单独的 Sybase 实例。

【讨论】:

  • 谢谢,很高兴知道这可以做到!实际上,我能够让它工作,制作所有映射 @Table(name="tablename", catalog="catalogname") 并使用 Spring bean 为我初始化模式(只有几个)。
猜你喜欢
  • 2019-11-02
  • 2019-09-05
  • 1970-01-01
  • 2015-06-04
  • 1970-01-01
  • 1970-01-01
  • 2023-01-28
  • 2013-03-20
  • 1970-01-01
相关资源
最近更新 更多