代码之家  ›  专栏  ›  技术社区  ›  msp albert muda

使用具有相同休眠映射文件的两个不同数据库

  •  1
  • msp albert muda  · 技术社区  · 17 年前

    基本上,这个想法是为两个不同的底层数据库使用相同的Hibernate映射文件。在产品中,底层数据库是mysql5,出于测试目的,我想使用apache derby,以避免为了测试目的而设置和维护各种mysql数据库。

    我希望只要切换数据源的驱动程序并更改几个参数就能完成这项工作,但我已经遇到了一些小问题。所以实际上有两个问题。第一个具体问题是:

    i.如果一个数据类型在MySQL中可用而不在Derby中,是否可以告诉Derby使用哪个数据类型?映射如下:

      <property name="about">
        <column name="`about`" not-null="false" sql-type="text"></column>
      </property>
    

    Derby不知道SQL类型“text”,因此它拒绝创建表。它是德比10.4.2.0和冬眠3.2.6。顺便说一句。

    二.您在使用两个不同的数据库进行测试和生产方面有什么经验?我知道有一些缺点,例如,您不能测试存储过程或特定于数据库的查询,但另一方面,它使测试变得更容易和更快(如果您最终运行它的话)。你怎么认为?

    4 回复  |  直到 17 年前
        1
  •  3
  •   ChssPly76    17 年前

    问题1-不要指定SQL类型;请使用 Hibernate type 而是:

    <property name="about" type="string" length="4096"/>
    

    然后,您可以扩展Hibernate提供的Derby(或MySQL)方言,以根据(un)指定的长度将该类型映射到适当的DB类型。以mysqlstandian为例,它将字符串类型映射到 varchar 或其中之一 text 基于长度的类型。

    问题2-您的意思是使用不同的数据库 发展 生产呢?因为使用不同的数据库 测试 而制作就像玩一个装满子弹的俄罗斯轮盘赌——你不会赢的——)

    您始终需要测试所有适用的部署配置。如果您确实需要同时支持这两个方面,那么使用不同的DBS进行开发和生产并不是一个糟糕的方法,因为它有助于尽早发现可移植性问题。

        2
  •  1
  •   Kathy Van Stone    17 年前

    在我看来,在测试中使用不同类型的数据库的主要原因是,在不可能伪造或模拟数据库的情况下,可以更快地进行单元测试(尽管在可以的情况下,应该进行后者)。请注意,应该有一个临时会话,在该会话中,测试可以针对生产类型的数据库运行,以确保没有对测试数据库进行编码。它还强制您编写通用数据库的代码——有时这是一个好主意,有时不是。

    显然,如果您需要一个特定于数据库的函数(存储过程甚至特殊类型),您应该使用相同的类型。

    在mysql的情况下,可以在一个测试中将表设置为 stored in memory . 如果您可能需要MySQL特定的项目,这是一个选项。如果目标是数据库通用性,那么在开发/低级测试中使用不同的数据库是一件好事。

        3
  •  1
  •   dustmachine    17 年前

    在不同的环境中使用不同的数据库供应商应该没有问题(注意CHSSply76的答案,即测试和prod应该是相同的)。虽然我还没试过德比。

    我个人喜欢用 HSQLDB 对于开发环境。它体积小,灵活,便于携带,几乎不需要任何设置。使用类似的工具 Unitils 把Hibernate、DBUnit和JUnit粘合在一起对我来说非常有效。在执行JUnit测试之前,将使用静态测试数据加载hsqldb。这允许数据访问层JUnit测试基于真实数据(它是从测试附近的一些XML文件加载的)拥有断言。

    (Unitils需要注意的一点是,默认的“加载策略”是在加载之前删除所有现有数据,因此在指向该对象的地方要小心)。

        4
  •  0
  •   Bryan Pendleton    17 年前

    根据我的经验,测试的数据库实现越多,就越快找到任何意外依赖于某个不可跨数据库移植的东西的地方。

    如果Derby使您的测试变得更快、更容易,那么这是一个很好的结果,因为更快、更容易的测试鼓励更多的测试。

    我认为Derby是一个很好的测试方法,因为Derby很难遵守SQL标准,并且只支持标准中指定的语法和行为,因此这有助于确保避免使用非标准数据库功能。

    但我同意,当您接近部署应用程序时,您需要使用尽可能接近预期部署配置的配置来测试它。