18

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

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

4

3 回答 3

29

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

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

此功能已在Rotterdam JBug 和 Hibernate 的 import.sql博客文章中宣布:

import.sql:在单元测试中轻松导入数据

Hibernate 有一个简洁的小功能,但文档严重不足且未知。SessionFactory您可以在数据库模式生成后立即在创建期间执行 SQL 脚本,以将数据导入新数据库。您只需要添加一个import.sql在您的类路径根目录中命名的文件,并将其设置createcreate-drop您的 hibernate.hbm2ddl.auto属性。

既然我已经开始了查询一章,我就将它用于 Hibernate Search in Action。它为我的单元测试使用一组新数据初始化我的数据库。JBoss Seam 在各种示例中也大量使用它。 import.sql是一个非常简单的功能,但有时非常有用。请记住,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');

有关此功能的更多信息,请查看Eyal 的博客,他写了一篇关于此功能的不错的小条目。请记住,如果您想添加额外的数据库对象(索引、表等),您还可以使用辅助数据库对象功能。

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

于 2010-08-04T19:47:36.620 回答
6

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

hibernate.hbm2ddl.import_files

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

于 2011-04-14T11:31:04.410 回答
1

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

于 2010-08-04T19:26:05.800 回答