如何使用Spring/JPA/Hibernate使用初始数据填充Java(Web)应用程序

Tuu*_*nen 17 java spring hibernate jpa web-applications

我想以编程方式使用初始数据设置我的数据库.我想填充我的数据库用于开发运行,而不是用于测试运行(这很容易).该产品构建于Spring和JPA/Hibernate之上.

  • 开发人员检查项目
  • 开发人员运行命令/脚本以使用初始数据设置数据库
  • 开发人员启动应用程序(服务器)并开始开发/测试

然后:

  • 开发人员运行命令/脚本来刷新数据库并使用新的初始数据进行设置,因为数据库结构或初始数据包已更改

我想要的是通过必需的部分设置我的环境,以便调用我的DAO并将新对象插入数据库.我不想在原始SQL,XML,转储数据库或其他任何东西中创建初始数据集.我想以编程方式创建对象并将其持久保存在数据库中,就像在普通应用程序逻辑中一样.

实现此目的的一种方法是正常启动我的应用程序并运行一个执行初始化的特殊servlet.但这真的是要走的路吗?我很乐意将初始数据设置作为Maven任务执行,如果我采用servlet方法,我不知道该怎么做.

一些类似的问题.我快速浏览了建议的DBUnit和Unitils.但他们似乎非常专注于设置测试环境,这不是我想要的.DBUnit执行初始数据填充,但仅使用xml/csv fixtures,这不是我在此之后所做的.然后,Maven有SQL插件,但我不想处理原始SQL.Maven也有Hibernate插件,但它似乎只对Hibernate配置和表模式创建有帮助(而不是用数据填充db).

这该怎么做?

部分解决方案2010-03-19

建议的替代方案是:

  • 使用单元测试填充数据库#2423663
  • 使用ServletContextListener获取对Web上下文启动#2424943和#2423874的控制
  • 使用Spring ApplicationListener和Spring的标准和自定义事件#2423874

我使用Spring的ApplicationListener实现了这个:

类:

public class ApplicationContextListener implements ApplicationListener {

    public void onApplicationEvent(ApplicationEvent event) {

        if (event instanceof ContextRefreshedEvent) {
            ...check if database is already populated, if not, populate it...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

applicationContext.xml中:

<bean id="applicationContextListener" class="my.namespaces.ApplicationContextListener" />
Run Code Online (Sandbox Code Playgroud)

出于某种原因,我无法启动ContextStartedEvent,因此我选择了在启动时启动的ContextRefreshedEvent(尚未碰到其他情况).

如何刷新数据库?目前,我只是删除了HSQLDB工件,并在Hibernate启动时生成了新的模式.因为DB也是空的.

Oli*_*ier 5

您可以使用JPA和普通Java编写单元测试来填充数据库.Maven将此测试称为标准构建生命周期的一部分.因此,您将获得一个完全初始化的数据库,使用Maven,JPA和Java按要求.

  • 我想每次重新启动/重新部署服务器时都会执行此初始化?我想手动执行flush/population.另外,你真的认为骚扰单元测试比使用servlet更好吗? (2认同)

Art*_*tic 1

取决于你的数据库。最好有脚本来设置数据库