我正在编写Web应用程序,我想知道填充初始数据的推荐方法是什么。这是JPA / Hibernate和Spring应用程序,由maven构建。到目前为止,我已经使用脚本填充数据库和初始数据,手动启动。
单元测试使用他们自己的数据,在每次测试之前在代码中创建。我的测试类扩展了 org.springframework.test.jpa.AbstractJpaTests 。
最后,我想有一个maven构建,它创建数据库表单实体(现在我需要第一次运行应用程序来创建数据库,然后运行脚本)然后填充初始/字典数据并运行单元和集成测试。这个过程应该是完全自动化的,以便将此构建放在CI服务器(hudson)中,从头开始创建新数据库也很感激。
附加要求:数据库无关的解决方案将是最有价值的。
编辑:我正在寻找的最好的例子是init closure in BootStrap.groovy。
答案 0 :(得分:6)
编辑:添加了指向博客帖子的链接,其中显示了如何使用Spring和DbUnit测试Hibernate JPA。
[...]我希望有一个maven构建,它可以从实体
创建数据库
maven hibernate3 plugin目标可能有hibernate3:hbm2ddl个目标。与maven sql plugin结合使用,应该可以从生成的DDL创建此模式。
[...]然后填充初始/字典数据
同样,maven sql plugin可以在这里完成工作。或者使用DBUnit这是另一种优雅的解决方案(参见maven dbunit plugin)。
并运行单元和集成测试。
好吧,我不确定您的单元测试是否应该访问数据库,但是对于集成测试,请按照我的说法检查DBUnit。它是一个非常好的工具,允许您在已知状态下设置数据库,在测试执行后测试预期内容的表并将数据库恢复到初始状态。请参阅Testing JPA Hibernate with Spring & DbUnit以获得一个很好的例子。
这个过程应该完全自动化,将这个构建放在CI服务器(hudson)中,从头开始创建新数据库也很感激。
我认为这是可行的。
答案 1 :(得分:1)
@David,谢谢你的帖子。我发现种子初始数据的唯一合理解决方案与您的相似 - 即在测试中插入数据。在我的代码中,我甚至不使用hibernate3-maven-plugin。 Spring在文件 jpaContext.xml
中完成数据库创建<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="jpaVendorAdapter">
<bean
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="true" />
<property name="generateDdl" value="true" />
<property name="databasePlatform" value="org.hibernate.dialect.HSQLDialect"/>
</bean>
</property>
<property name="dataSource" ref="dataSource"/>
在我写的时候,我使用 org.springframework.test.jpa.AbstractJpaTests 和覆盖方法
@Override
protected String[] getConfigLocations() {
return new String[]{
"classpath:/jpaContext.xml"};
}
我认为它会简化您的解决方案。我仍然在寻找更好的分辨率来创建初始数据。手工创建具有大量关系的对象非常麻烦。
答案 2 :(得分:0)
我通过扩展
解决了与你的问题几乎完全相同的问题 org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests
然后我在测试时使用hibernate3-maven-plugin填充数据库(我使用了hsqldb):
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>hibernate3-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<components>
<component>
<name>hbm2ddl</name>
<implementation>jpaconfiguration</implementation>
</component>
</components>
<componentProperties>
<drop>true</drop>
<jdk5>true</jdk5>
<propertyfile>target/classes/jdbc.properties</propertyfile>
<skip>${maven.test.skip}</skip>
</componentProperties>
</configuration>
<executions>
<execution>
<phase>process-test-resources</phase>
<goals>
<goal>hbm2ddl</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>${jdbc.groupId}</groupId>
<artifactId>${jdbc.artifactId}</artifactId>
<version>${jdbc.version}</version>
</dependency>
</dependencies>
</plugin>
我在Google Code上发布simple maven project来演示该技术。