如何使用初始数据填充 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 的数据填充它?

如何在基于月份的 MySQL 填充数据后基于每日填充数据

如何在行单击时用数据填充指定的详细信息网格

如何使用动态数量的数据条目初始化表单集

如何使用填充单元格的 UIImageView 初始化自定义 UICollectionViewCell?

在哪里以及如何使用片段填充我的标签