部署后初始化 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 嵌入式数据库的主要内容,如果未能解决你的问题,请参考以下文章
使用 IntelliJ 部署启用嵌入式 tomcat 的 spring-boot 应用程序
如何在嵌入式 tomcat 服务器上部署 Spring Boot Web 应用程序,来自 Spring Boot 本身