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
的文件,并将create
或create-drop
为hibernate.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 ,它提供了一个钩子来预填充测试表数据等。
- 如何使用cascade =“all,delete-orphan”制作hibernate集合的副本
- Hibernate获取映射实体的所有外键
- Hibernate将用户模型保存到Postgres
- org.hibernate.LazyInitializationException:无法初始化代理 – 没有会话?
- Hibernate / GORM:flush()不处理集合
- java.lang.IllegalStateException:具有@ManyToMany 3实体的同一实体的多个表示forms
- javagenerics类型参数和对这些类型的操作
- 我可以在Hibernate管理的表中添加“ON DELETE CASCADE”吗?
- 如果存在,则关闭打开的hibernate会话