部署后初始化 Spring 嵌入式数据库

Posted

技术标签:

【中文标题】部署后初始化 Spring 嵌入式数据库【英文标题】:Initialize Spring embedded database after deployment 【发布时间】:2013-07-07 18:04:58 【问题描述】:

我有一个带有嵌入式数据库 (HSQLDB) 的 Spring MVC 应用程序,我想在部署后对其进行初始化。我知道我可以使用 xml 脚本为我的数据源定义初始数据,但是,只要我使用 JPA + Hibernate,我想使用 Java 代码。有没有办法做到这一点?

【问题讨论】:

【参考方案1】:

大量更新的答案(之前太复杂了):

您只需将初始化 bean 添加到您的上下文中,这会将所有必要的数据插入到数据库中:

public class MockDataPopulator 

    private static boolean populated = false;

    @Autowired
    private SessionFactory sessionFactory;

    @PostConstruct
    public void populateDatabase() 
        // Prevent duplicate initialization as HSQL is also initialized only once. Duplicate executions 
        // can happen when the application context is reloaded - e.g. when running unit tests).
        if (populated) 
            return;
        
        // Create new persistence session
        Session session = sessionFactory.openSession();
        session.setFlushMode(FlushMode.ALWAYS);
        // Insert mock entities
        session.merge(MockDataFactory.createMyFirstObject())
        session.merge(MockDataFactory.createMySeconfObject())
        // ...
        // Flush and close
        session.flush();
        session.close();
        // Set initialization flag
        populated = true;
    


【讨论】:

哇,仅添加一些记录就太过分了。我认为 Spring 会有类似 ServletContextListener 的东西来知道是否一切都准备好了。无论如何,感谢您的出色回答。 嗯,不过分。我可能让它看起来太复杂了。您只需要创建一个InitializingBean(或带有@PostConstruct 的bean),它将初始化数据。我们还在我们的应用程序中动态生成数据库模式......这是上述复杂性的一部分。也许我应该重写我的答案以保持简单。 好的...我已经从我们的应用程序中删除了复制粘贴代码并编写了最简单的示例。抱歉之前的复杂混乱:)。 我喜欢这样:您可以添加对象而不是运行脚本。用于测试时,映射更改时您的测试不会中断。

以上是关于部署后初始化 Spring 嵌入式数据库的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot如何启动嵌入式Tomcat?

Spring第一个请求非常慢

使用 IntelliJ 部署启用嵌入式 tomcat 的 spring-boot 应用程序

如何在嵌入式 tomcat 服务器上部署 Spring Boot Web 应用程序,来自 Spring Boot 本身

java - 如何在java桌面应用程序中使用spring(事务)和hibernate创建嵌入式H2 DB?

Spring:无法确定数据库类型 NONE 的嵌入式数据库驱动程序类