如何使用Spring/JPA/Hibernate用初始数据填充Java(Web)应用程序
我想以编程方式使用初始数据设置数据库。我想为开发运行填充数据库,而不是为测试运行填充数据库(这很容易)。该产品建立在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启动时生成了一个新的模式。因为数据库也是空的。