Hibernate 如何用初始数据填充web应用程序

Hibernate 如何用初始数据填充web应用程序,hibernate,maven-2,orm,jpa,Hibernate,Maven 2,Orm,Jpa,我正在编写web应用程序,不知道填充初始数据的推荐方法是什么。这是JPA/Hibernate和Spring应用程序,由maven构建。到目前为止,我使用的脚本用初始数据填充数据库,这是手动开始的 单元测试使用他们自己的数据,在每次测试之前用代码创建。我的测试类扩展了org.springframework.test.jpa.AbstractJpaTests 最后,我想要一个maven构建,它创建数据库表单实体(现在我需要第一次运行应用程序来创建数据库,然后运行脚本),然后填充初始/字典数据并运行单

我正在编写web应用程序,不知道填充初始数据的推荐方法是什么。这是JPA/Hibernate和Spring应用程序,由maven构建。到目前为止,我使用的脚本用初始数据填充数据库,这是手动开始的

单元测试使用他们自己的数据,在每次测试之前用代码创建。我的测试类扩展了org.springframework.test.jpa.AbstractJpaTests

最后,我想要一个maven构建,它创建数据库表单实体(现在我需要第一次运行应用程序来创建数据库,然后运行脚本),然后填充初始/字典数据并运行单元和集成测试。这个过程应该是完全自动化的,以便将这个构建放在CI服务器(hudson)中,从头开始创建新的数据库也是值得的

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


编辑:我要找的最好的例子是。

编辑:添加了一个链接到一篇博客文章,展示了如何使用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"};
  }