我正在开发一个项目,其中某些实体应该包含应用程序首次启动时应设置的初始数据。
截至目前,我们在使用服务时以及相应的实体为空时执行了一个函数。但这会强制我们每次调用服务时都使用if
语句检查此实体。它应该是一个临时解决方案。
现在我想知道保存初始数据的最佳方法是什么。是通过使用在设置具有所有表结构的数据库之后执行的插入查询(例如在master.xml中)?如果是这样,我们怎样才能确保在重新启动应用程序后再次插入数据?或者仍然是使用实体服务的最佳方式,但是如何有效地实现呢?
答案 0 :(得分:4)
您可以执行以下操作之一:
<强> Liquibase 强>
使用Liquibase和changelog插入带有loadData标记的数据(如jhipster插入初始用户)。此更改日志必须附加到master.xml。 Liquibase只负责执行每个更改日志一次。
我们没有使用这个,因为当初始数据发生变化时,您将需要另一个带有新更改日志的csv,这可能会非常混乱。此外,您将需要与表格形式匹配的表格中的数据。因此,它必须是(或多或少)静态数据。
应用程序监听器
因此我们使用“startup-hook”,因此我们已经可以访问数据库并能够动态定义实体,计算内容等。
为此,我们通过在组件中实现implements ApplicationListener<ContextRefreshedEvent>
来连接应用程序启动事件,例如
@Component
public class StartupService implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
//...loading stuff
}
}
如果您已插入数据,则需要检查一些内容。一个简单的方法是检查存储库是否为空。我们有一些自己的迁移表,在onApplicationEvent中检查。这允许我们“注册”不同的迁移步骤到这个启动方法。