Spring / Hibernate测试:在DDL创建后插入测试数据

我有一个Spring / Hibernate webapp,它有一些在内存中的HSQL数据库上运行的集成测试。 Hibernate采用这个空白数据库,并通过hbm2ddl = create创建我的所有测试表和约束。 但是,我有一个新的bean,它在afterPropertiesSet()方法期间检查数据库中的特定配置值,因此当初始化此bean时,数据库中需要存在这样的行。

有没有什么好方法可以设置一个类似于Rail的测试装置的Java / Spring / Hibernate? 我试图找到一种方法告诉Hibernate“无论何时创建此表,然后立即插入这些行”。 我找不到可以添加的回调或钩子,但也许还有另一种方式。

我试图找到一种方法告诉Hibernate“无论何时创建此表,然后立即插入这些行”

从Hibernate 3.1开始,你可以在Hibernate的运行时类路径中包含一个名为import.sql的文件,在模式导出时,Hibernate将在导出模式后执行该文件中包含的SQL语句。

此function已在鹿特丹JBug和Hibernate的import.sql博客文章中公布:

import.sql:轻松导入unit testing中的数据

Hibernate有一个整洁的小function,严重缺乏记录和未知。 您可以在生成数据库模式之后立即在SessionFactory创建期间执行SQL脚本,以在新数据库中导入数据。 您只需在类路径根目录中添加名为import.sql的文件,并将createcreate-drophibernate.hbm2ddl.auto属性。

现在我已经启动了查询章节,我将它用于Hibernate Search in Action。 它使用一组新的数据为我的unit testing初始化​​我的数据库。 JBoss Seam在各种示例中也使用了很多。 import.sql是一个非常简单的function,但是非常有用。 请记住,SQL可能依赖于您的数据库(可移植性啊!)。

 #import.sql file delete from PRODUCTS insert into PRODUCTS (PROD_ID, ASIN, TITLE, PRICE, IMAGE_URL, DESCRIPTION) values ('1', '630522577X', 'My Fair Lady', 19.98, '630522577X.jpg', 'My Fair blah blah...'); insert into PRODUCTS (PROD_ID, ASIN, TITLE, PRICE, IMAGE_URL, DESCRIPTION) values ('2', 'B00003CXCD', 'Roman Holiday ', 12.98, 'B00003CXCD.jpg', 'We could argue that blah blah'); 

有关此function的更多信息,请查看Eyal的博客 ,他写了一篇关于它的精彩文章。 请记住,如果要添加其他数据库对象(索引,表等),还可以使用辅助数据库对象function。

它仍然没有真正记录在案。

在hibernate 3.6中,允许运行任意sql命令的配置是:

hibernate.hbm2ddl.import_files

请参阅http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/ ,注意文档中存在错误:属性为import_files,最后带有s。

如果您正在讨论JUnit测试并使用AbstractTransactionalDataSourceSpringContextTests ,那么可以覆盖的方法如onSetupBeforeTransaction ,它提供了一个钩子来预填充测试表数据等。