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

标签 java hibernate spring web-applications jpa

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

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

然后:

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

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

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

somewhat similar question .我快速浏览了建议的 DBUnit 和 Unitils。但他们似乎非常专注于设置测试环境,这不是我想要的。 DBUnit 进行初始数据填充,但仅使用 xml/csv 固定装置,这不是我想要的。然后,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...
        }
    }
}

applicationContext.xml:

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

由于某种原因我无法启动 ContextStartedEvent,所以我选择了在启动时启动的 ContextRefreshedEvent(还没有遇到其他情况)。

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

最佳答案

您可以使用 JPA 和纯 Java 编写单元测试来填充数据库。 Maven 将调用此测试作为标准构建生命周期的一部分。 结果,您将获得一个完全初始化的数据库,并按照要求使用 Maven、JPA 和 Java。

关于java - 如何使用 Spring/JPA/Hibernate 使用初始数据填充 Java (Web) 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2423466/

相关文章:

java - 为什么这段代码没有产生预期的结果?

java - app.props 中定义的 Activity 配置文件,但是环境变量返回 Activity 配置文件的空数组

Hibernate:多对多关系表作为实体

java - Spring 管理属性的最佳方式

java - 如何将 Scala 命令行参数传递给 Java 方法?

java - Hibernate 使用 @ManyToOne 和 @Lazy 获取对象来生成额外的 SQL 语句

java - 在 Hibernate 中更改生成的外键名称

spring - 为什么我在 Spring MVC 中得到此 URL 的 "400 Bad Request"?

java - 在 Spring 中使用事务进行同步

java - 如何同时运行/显示多个图形方法?