弹簧/休眠测试:在创建 DDL 后插入测试数据

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

有没有好的方法可以设置一个Java /Spring/Hibernate相当于Rail的测试夹具?我试图找到一种方法来告诉Hibernate“每当你创建这个表时,立即插入这些行”。我找不到可以添加的回调或钩子,但也许还有另一种方法。


答案 1

我试图找到一种方法来告诉Hibernate“每当你创建这个表时,立即插入这些行”

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

此功能已在鹿特丹JBug和Hibernate的导入.sql博客文章中宣布:

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

Hibernate有一个整洁的小功能,这个功能被严重记录不足和未知。您可以在数据库架构生成后立即在创建期间执行 SQL 脚本,以导入新数据库中的数据。您只需要添加一个在类路径根目录中命名的文件,并将 或 设置为您的属性。SessionFactoryimport.sqlcreatecreate-drophibernate.hbm2ddl.auto

我现在用它来进行休眠搜索操作,因为我已经开始了查询章节。它使用一组新的数据初始化我的数据库,用于我的单元测试。JBoss Seam在各种示例中也经常使用它。 是一个非常简单的功能,但有时非常有用。请记住,SQL可能依赖于您的数据库(啊,可移植性!import.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的博客,他写了一个关于它的漂亮小条目。请记住,如果要添加其他数据库对象(索引、表等),也可以使用辅助数据库对象功能。

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


答案 2

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

hibernate.hbm2ddl.import_files

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


推荐