我有一个Spring / Hibernate webapp,它有一些在内存中的HSQL数据库上运行的集成测试。由于hbm2ddl = create,Hibernate使用这个空白数据库并创建我的所有测试表和约束。但是,我有一个新的bean,它在afterPropertiesSet()方法中检查数据库中的特定配置值,因此当初始化此bean时,数据库中需要存在这样的行。
有没有什么好方法可以设置一个类似于Rail的测试装置的Java / Spring / Hibernate?我试图找到一种方法告诉Hibernate“无论何时创建此表,然后立即插入这些行”。我找不到可以添加的回调或挂钩,但也许还有另一种方式。
答案 0 :(得分:27)
我正试图找到一种方法告诉Hibernate“无论何时创建此表,然后立即插入这些行”
从Hibernate 3.1开始,你可以在Hibernate的运行时类路径中包含一个名为import.sql
的文件,在模式导出时,Hibernate将在导出模式后执行该文件中包含的SQL语句。
此功能已在Rotterdam JBug and Hibernate's import.sql博文中宣布:
import.sql: easily import data in your unit tests
Hibernate有一个简洁的小功能 这是严重缺乏记录和 未知。您可以执行SQL脚本 在
SessionFactory
创建期间 就在数据库架构之后 生成以新鲜的方式导入数据 数据库。您只需要添加一个文件 在类路径中命名为import.sql
root并设置create
或create-drop
作为你的hibernate.hbm2ddl.auto
财产。我用它来进行Hibernate Search 现在就开始行动了 查询章节。它初始化了我的 带有一组新数据的数据库 我的单元测试。 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's blog,他 写了一篇关于它的精彩小条目。 请记住,如果您想添加其他内容 数据库对象(索引,表和 等等),你也可以使用辅助 数据库对象功能。
仍然没有真正记录。
答案 1 :(得分: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。
答案 2 :(得分:1)
如果您正在讨论JUnit测试并使用AbstractTransactionalDataSourceSpringContextTests,您可以覆盖类似onSetupBeforeTransaction的方法,这些方法提供了预先填充测试表数据等的挂钩。