gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:52:11 25 4
gpt4 key购买 nike

我想以编程方式使用初始数据设置我的数据库。我想填充我的数据库以进行开发运行,而不是用于测试运行(这很容易)。该产品建立在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com