如何使用初始数据填充 Web 应用程序
Posted
技术标签:
【中文标题】如何使用初始数据填充 Web 应用程序【英文标题】:How to populate web application with initial data 【发布时间】:2010-11-29 03:28:18 【问题描述】:我正在编写 Web 应用程序,想知道推荐的方法是填充初始数据。这是 JPA/Hibernate 和 Spring 应用程序,由 maven 构建。到目前为止,我使用的脚本是手动启动的用初始数据填充数据库的脚本。
单元测试使用自己的数据,在每次测试之前在代码中创建。我的测试类扩展了 org.springframework.test.jpa.AbstractJpaTests。
最后我想要一个创建数据库表单实体的 maven 构建(现在我需要第一次运行应用程序来创建数据库,然后运行脚本)然后填充初始/字典数据并运行单元和集成测试。这个过程应该是完全自动化的,以便将此构建放入 CI 服务器 (hudson),从头开始创建新数据库也是值得赞赏的。
附加要求:与数据库无关的解决方案将是最有价值的。
编辑:我正在寻找的最佳示例是init closure in BootStrap.groovy。
【问题讨论】:
【参考方案1】:编辑:添加了指向博客文章的链接,该链接展示了如何使用 Spring 和 DbUnit 测试 Hibernate JPA。
[...] 我想要一个从实体创建数据库的 maven 构建
有一个带有hibernate3:hbm2ddl 目标的maven hibernate3 plugin 可能会有所帮助。再加上maven sql plugin,应该可以从生成的DDL创建这个schema。
[...] 然后填充初始/字典数据
同样,maven sql plugin 可以在这里完成工作。或者使用DBUnit,这是另一种优雅的解决方案(参见maven dbunit plugin)。
并运行单元和集成测试。
好吧,我不确定您的单元测试是否应该访问数据库,但是对于集成测试,请检查 DBUnit,正如我所说的。它确实是一个非常好的工具,允许您将数据库设置为已知状态,在测试执行后测试预期内容的表并将数据库恢复到初始状态。请参阅 Testing JPA Hibernate with Spring & DbUnit 获取一个很好的示例。
这个过程应该是完全自动化的,以便将此构建放入 CI 服务器 (hudson),从头开始创建新数据库也很受欢迎。
我认为这是可行的。
【讨论】:
我考虑使用 Unitils 进行单元测试。我想知道是否有办法在 script/xml 文件中定义初始数据,将它们读入 java 并使用 JPA/Hibernate 保存 - 以与数据库无关的方式。 检查 DBUnit,这就是你要找的,除了它不是基于 JPA 的。 DBunit 及其 API 允许您在 xml/csv 中定义初始数据和预期数据,从单元测试中加载它们,对表内容执行断言,将数据库恢复到初始状态。 DBUnit 和 Unitils 之间有集成(参见unitils.org/apidocs/org/unitils/dbunit/package-summary.html)【参考方案2】:@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";
我认为它应该简化您的解决方案。我仍在寻找更好的解决方案来创建初始数据。手动创建具有大量关系的对象很麻烦。
【讨论】:
对 DbUnit 有任何负面反馈(只是想知道您是否正在阅读我的答案和/或 cmets)? @Pascal。为什么是负面的? :) 我读了你的 cmets/answers。对我来说最可预测的解决方案是调整(我仍在寻找如何)JPA/Hibernate 方式。 Unitils/DBUnit 是另一个不错的选择,但第二个。【参考方案3】:我通过扩展解决了一个与你几乎相同的问题
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 来演示该技术。
【讨论】:
我没有任何不使用 DBUnit 的技术原因。我只是没用过。我会看看它并适当地更新我的示例项目。至此,我已经在代码中创建了测试数据。这对于示例项目来说是合理的,但是在测试真实世界的代码时,就需要像 DBUnit 这样的解决方案。谢谢你的建议。以上是关于如何使用初始数据填充 Web 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 AutoCompleteTextView 并使用来自 Web API 的数据填充它?