Hibernate 如何用初始数据填充web应用程序
我正在编写web应用程序,不知道填充初始数据的推荐方法是什么。这是JPA/Hibernate和Spring应用程序,由maven构建。到目前为止,我使用的脚本用初始数据填充数据库,这是手动开始的 单元测试使用他们自己的数据,在每次测试之前用代码创建。我的测试类扩展了org.springframework.test.jpa.AbstractJpaTests 最后,我想要一个maven构建,它创建数据库表单实体(现在我需要第一次运行应用程序来创建数据库,然后运行脚本),然后填充初始/字典数据并运行单元和集成测试。这个过程应该是完全自动化的,以便将这个构建放在CI服务器(hudson)中,从头开始创建新的数据库也是值得的 附加要求:数据库无关解决方案将是最有价值的Hibernate 如何用初始数据填充web应用程序,hibernate,maven-2,orm,jpa,Hibernate,Maven 2,Orm,Jpa,我正在编写web应用程序,不知道填充初始数据的推荐方法是什么。这是JPA/Hibernate和Spring应用程序,由maven构建。到目前为止,我使用的脚本用初始数据填充数据库,这是手动开始的 单元测试使用他们自己的数据,在每次测试之前用代码创建。我的测试类扩展了org.springframework.test.jpa.AbstractJpaTests 最后,我想要一个maven构建,它创建数据库表单实体(现在我需要第一次运行应用程序来创建数据库,然后运行脚本),然后填充初始/字典数据并运行单
编辑:我要找的最好的例子是。编辑:添加了一个链接到一篇博客文章,展示了如何使用Spring和DbUnit测试Hibernate JPA […]我想要一个maven构建,它可以从实体创建数据库 有一个目标可能会有所帮助。再加上,应该可以从生成的DDL创建此模式 […]然后填充初始/字典数据 再说一次,他们可以在这里完成这项工作。或者,这可能是另一个优雅的解决方案(请参阅) 并运行单元和集成测试 嗯,我不确定您的单元测试是否应该访问数据库,但是,对于集成测试,请按照我所说的进行检查。它确实是一个非常好的工具,允许您在已知状态下设置数据库,在测试执行后测试表的预期内容,并将数据库恢复到初始状态。请参阅以获取一个很好的示例 这个过程应该是完全自动化的,以便将这个构建放在CI服务器(hudson)中,从头开始创建新的数据库也是很有价值的
我认为这是可行的。我通过扩展解决了一个与您的问题几乎相同的问题
org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests
然后,我在测试时使用hibernate3 maven插件填充数据库(我使用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>
org.codehaus.mojo
在谷歌代码上演示这项技术。@David,谢谢你的帖子。我找到的唯一合理的解决方案是在初始数据中植入种子,这与您的类似,即在测试中插入数据。在我的代码中,我甚至没有使用hibernate3 maven插件。Spring在文件jpaContext.xml中创建数据库
我认为这应该简化你的解决方案。我仍然在寻找更好的解决方案来创建初始数据。用手工创建很多关系的对象是麻烦的。我考虑使用UNITILS用于我的单元测试。我想知道是否有办法在script/xml文件中定义初始数据,使用JPA/Hibernate将它们读入java和persit——以数据库无关的方式。DBunit及其API允许您在xml/csv中定义初始数据和预期数据,从单元测试中加载它们,对表内容执行断言,在初始状态下恢复数据库。DBUnit和Unitils之间有集成(请参阅)关于DBUnit的任何负面反馈(只是想知道您是否正在阅读我的答案和/或评论)?@Pascal。为什么是否定的?:)我读了你的评论/回答。对我来说,最好的解决方案是以JPA/Hibernate的方式tunning(我仍在研究如何)。Unitils/DBUnit是另一个很好的选择,但却是第二个选择。我没有任何不使用DBUnit的技术原因。我只是没用过。我将看看它,并适当地更新我的示例项目。至此,我已经在代码中创建了测试数据。这对于一个示例项目来说是合理的,但是当涉及到测试真实世界的代码时,像DBUnit这样的解决方案是必要的。谢谢你的建议。
<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"/>
@Override
protected String[] getConfigLocations() {
return new String[]{
"classpath:/jpaContext.xml"};
}