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

2022-09-03 02:29:00

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

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

然后:

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

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

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

还有一些类似的问题。我快速浏览了一下建议的DBUnit和Unitils。但是他们似乎非常专注于设置测试环境,这不是我想要的。DBUnit 进行初始数据填充,但仅使用 xml/csv 固定装置,这不是我在这里所追求的。然后,Maven有SQL插件,但我不想处理原始SQL。Maven也有Hibernate插件,但它似乎只在Hibernate配置和表模式创建中有所帮助(而不是用数据填充数据库)。

如何做到这一点?

部分解决方案 2010-03-19

建议的替代方案包括:

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

我使用Spring的AppplicationListener实现了这一点:

类:

public class ApplicationContextListener implements ApplicationListener {

    public void onApplicationEvent(ApplicationEvent event) {

        if (event instanceof ContextRefreshedEvent) {
            ...check if database is already populated, if not, populate it...
        }
    }
}

应用上下文.xml:

<bean id="applicationContextListener" class="my.namespaces.ApplicationContextListener" />

由于某种原因,我无法启动 ContextStartedEvent,所以我选择了 ContextRefreshedEvent,它也在初创公司中启动(还没有遇到其他情况)。

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


答案 1

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


答案 2

执行此操作的常用方法是使用 SQL 脚本。然后,运行一个特定的 bash 文件,该文件使用.sql
如果您希望能够在 WebApp 启动期间以编程方式设置数据库,则可以使用 Web 上下文侦听器
在webContext初始化期间,您可以使用Servlet上下文侦听器来访问DAO(服务层......任何内容)创建实体并保留它们,就像您在Java代码中所做的那样

p.s. 作为参考 Servlet 生命周期

如果您使用Spring,您应该查看“参考”的“标准和自定义事件”部分。这是实现“Spring Listener”的更好方法,该“Spring Listener”可以了解Spring的上下文(如果您需要从中检索您的服务)


推荐