什么';在JHipster中保存初始数据的最佳实践是什么?

什么';在JHipster中保存初始数据的最佳实践是什么?,jhipster,Jhipster,我正在做一个项目,其中一些实体应该包含初始数据,这些数据应该在应用程序第一次启动时设置 现在,我们有一个函数在使用服务时执行,如果相应的实体为空。但这迫使我们在每次调用服务时使用if语句检查该实体。这应该是一个暂时的解决办法 现在我想知道保存初始数据的最佳方法是什么。是否使用了一个插入查询,该查询将在设置数据库及其所有表结构后执行(例如,在master.xml中)?如果是这样,我们如何确保重新启动应用程序后不会再次插入数据?或者,最好的方法仍然是使用实体服务,但如何有效地使用实体服务?您可以执行

我正在做一个项目,其中一些实体应该包含初始数据,这些数据应该在应用程序第一次启动时设置

现在,我们有一个函数在使用服务时执行,如果相应的实体为空。但这迫使我们在每次调用服务时使用
if
语句检查该实体。这应该是一个暂时的解决办法


现在我想知道保存初始数据的最佳方法是什么。是否使用了一个插入查询,该查询将在设置数据库及其所有表结构后执行(例如,在master.xml中)?如果是这样,我们如何确保重新启动应用程序后不会再次插入数据?或者,最好的方法仍然是使用实体服务,但如何有效地使用实体服务?

您可以执行以下操作之一:

液化

使用带有changelog的Liquibase插入带有标记的数据(如jhipster插入初始用户)。此更改日志必须附加到master.xml。Liquibase只负责执行每个变更日志一次

我们没有使用这个,因为当初始数据发生变化时,您将需要另一个带有新变更日志的csv,这可能会非常混乱。此外,您还需要数据的格式与表的格式相匹配。因此,反过来,它必须是(或多或少)静态数据

应用程序侦听器

所以我们使用了一个“启动钩子”,这样我们就可以访问数据库,并且能够动态地定义实体,计算东西等等

为此,我们通过在组件中实现
implements ApplicationListener
来连接应用程序启动事件,例如

@Component
public class StartupService implements ApplicationListener<ContextRefreshedEvent> {

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        //...loading stuff
    }
}
@组件
公共类StartupService实现ApplicationListener{
@凌驾
ApplicationEvent(ContextRefreshedEvent事件)上的公共无效{
//…装东西
}
}

如果已经插入数据或没有插入数据,则需要进行检查。一个简单的方法是检查存储库是否为空。我们有一个自己的迁移表,在onApplicationEvent中检查。这允许我们将不同的迁移步骤“注册”到此启动方法。

您可以执行以下操作之一:

液化

使用带有changelog的Liquibase插入带有标记的数据(如jhipster插入初始用户)。此更改日志必须附加到master.xml。Liquibase只负责执行每个变更日志一次

我们没有使用这个,因为当初始数据发生变化时,您将需要另一个带有新变更日志的csv,这可能会非常混乱。此外,您还需要数据的格式与表的格式相匹配。因此,反过来,它必须是(或多或少)静态数据

应用程序侦听器

所以我们使用了一个“启动钩子”,这样我们就可以访问数据库,并且能够动态地定义实体,计算东西等等

为此,我们通过在组件中实现
implements ApplicationListener
来连接应用程序启动事件,例如

@Component
public class StartupService implements ApplicationListener<ContextRefreshedEvent> {

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        //...loading stuff
    }
}
@组件
公共类StartupService实现ApplicationListener{
@凌驾
ApplicationEvent(ContextRefreshedEvent事件)上的公共无效{
//…装东西
}
}

如果已经插入数据或没有插入数据,则需要进行检查。一个简单的方法是检查存储库是否为空。我们有一个自己的迁移表,在onApplicationEvent中检查。这允许我们将不同的迁移步骤“注册”到此启动方法。

是的,我们确实使用JPA。好的,那么您可以在不同的上下文中使用Liquibase LoadData。Liquibase确保数据只插入一次,因为它将迁移校验和保存在db架构的表中。感谢@GaëlMarziou,LoadData正是我要查找的。是的,我们使用JPA。好的,那么您可以在不同的上下文中使用Liquibase LoadData。Liquibase确保数据只插入一次,因为它将迁移校验和保存在数据库模式的表中。谢谢@GaëlMarziou,LoadData正是我想要的。不要忘记使用Liquibase上下文在测试或生产中加载不同的数据非常有用。不要忘记使用Liquibase上下文在测试或生产中加载不同的数据非常有用。