2009-11-10 68 views
1

基本上这个想法是为两个不同的底层数据库使用相同的hibernate映射文件。在生产中,底层数据库是MySQL5,为了测试的目的,我想使用Apache Derby--以避免为测试目的设置和维护各种MySQL数据库。使用两个不同的数据库和相同的休眠映射文件

我希望只是交换数据源的驱动程序,并改变一些PARAMS会做的工作,但我已经遇到了一些小的困难。所以实际上有两个问题。第一个具体问题是:

一,是否有可能告诉Derby其数据类型,如果数据类型是可以在MySQL和是不是在德比中使用。映射如下:

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

德比不知道sql型“文本”,所以它拒绝创建表。它是Derby 10.4.2.0和Hibernate 3.2.6。顺便一提。

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

回答

3

问题1 - 不指定sql类型;使用Hibernate type代替:

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

然后可以延伸Hibernate提供映射该类型到适当的基础上(未)指定长度DB类型德比(或MySQL)方言。以MySQLDialect为例,它会根据长度将字符串类型映射到varchartext类型之一。

问题2 - 你的意思是使用不同的数据库开发和生产?由于使用不同的数据库进行测试生产就像玩俄罗斯轮盘赌满载桶 - 你是不是要去赢:-)

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

+0

它实际上是测试而不是开发。有所有有用的答案,但你与俄罗斯轮盘赌的观点只是说服了我,谢谢:-) – msparer 2009-11-11 18:37:41

1

的主要原因使用测试不同类型的数据库中,在我看来,能有更快的单元测试的地方是不切实际的假的或模拟数据库(虽然时,你可以,你应该做的是后者)。请注意,应该有一个临时会话,其中可以针对生产类型的数据库运行测试,以确定您没有编码到测试数据库。它也迫使你编写一个通用数据库 - 有时候这是一个好主意,有时候不是。

显然,如果您需要数据库特定功能(存储过程或甚至特殊类型),则应使用相同的类型。

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

1

应该有在不同环境中使用不同的数据库供应商(注意ChssPly76的回答是TEST和PROD应该是相同的),没有问题。虽然我还没有尝试德比(还)。

我个人喜欢使用HSQLDB作为DEV环境。它体积小,灵活,便于携带,需要很少或不需要安装。使用像Unitils这样的工具粘合在一起Hibernate,DbUnit和JUnit对我来说工作得非常好。在执行JUnit测试之前,HSQLDB将加载静态测试数据。这允许数据访问层JUnit测试基于真实数据(它从坐在测试附近的一些xml文件加载)具有断言。 (Unitils的一个注意事项是默认的“loadStrategy”是在加载之前删除所有现有的数据,所以要小心你指向那个东西的地方)。

0

根据我的经验,您测试的数据库实现越多,您越早发现任何意外地依赖于不可移植的数据库的地方。

如果Derby让您的测试变得更快更简单,那么这是一个很好的结果,因为更快,更简单的测试会鼓励更多的测试。

我认为Derby是用于测试的绝佳选择,因为Derby非常努力地遵守SQL标准并仅支持标准中指定的语法和行为,所以这应该有助于确保您避免使用非标准的数据库功能。

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