如何使用初始数据填充Web应用程序

时间:2009-09-17 12:38:14

标签: hibernate maven-2 orm jpa

我正在编写Web应用程序,我想知道填充初始数据的推荐方法是什么。这是JPA / Hibernate和Spring应用程序,由maven构建。到目前为止,我已经使用脚本填充数据库和初始数据,手动启动。
单元测试使用他们自己的数据,在每次测试之前在代码中创建。我的测试类扩展了 org.springframework.test.jpa.AbstractJpaTests
最后,我想有一个maven构建,它创建数据库表单实体(现在我需要第一次运行应用程序来创建数据库,然后运行脚本)然后填充初始/字典数据并运行单元和集成测试。这个过程应该是完全自动化的,以便将此构建放在CI服务器(hudson)中,从头开始创建新数据库也很感激。


附加要求:数据库无关的解决方案将是最有价值的。

编辑:我正在寻找的最好的例子是init closure in BootStrap.groovy

3 个答案:

答案 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来演示该技术。