web-dev-qa-db-fra.com

Spring Boot insère des exemples de données dans la base de données au démarrage

Quelle est la bonne façon de créer des données de test au démarrage du serveur et de les insérer dans la base de données (j'utilise une instance Postgres soutenue par JPA/JDBC).

De préférence sous forme de création d'entités et de les faire persister via une interface de référentiel plutôt que d'écrire du code SQL simple. Quelque chose comme RoR's Rake db:seed assistant.

Si le framework expose un hook pour faire des choses lorsque tous les beans ont été injectés et que la base de données est prête, cela pourrait également fonctionner.

11
DarthPaghius

Vous pouvez attraper ApplicationReadyEvent puis insérer des données de démonstration, par exemple:

@Component
public class DemoData {

    @Autowired
    private final EntityRepository repo;

    @EventListener
    public void appReady(ApplicationReadyEvent event) {

        repo.save(new Entity(...));
    }
}

Ou vous pouvez implémenter CommandLineRunner ou ApplicationRunner, pour charger les données de démonstration lorsqu'une application est complètement démarrée:

@Component
public class DemoData implements CommandLineRunner {

    @Autowired
    private final EntityRepository repo;

    @Override
    public void run(String...args) throws Exception {

        repo.save(new Entity(...));
    }
}

@Component
public class DemoData implements ApplicationRunner {

    @Autowired
    private final EntityRepository repo;

    @Override
    public void run(ApplicationArguments args) throws Exception {

        repo.save(new Entity(...));
    }
}

Ou même implémentez-les comme un droit Bean dans votre classe Application (ou autre classe 'config'):

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public CommandLineRunner demoData(EntityRepository repo) {
        return args -> { 

            repo.save(new Entity(...));
        }
    }
}
16
Cepr0

De la documentation Spring: http://docs.spring.io/spring-boot/docs/1.5.4.RELEASE/reference/htmlsingle/#howto-database-initialization

Initialiser une base de données en utilisant Hibernate Un fichier nommé import.sql à la racine du chemin de classe sera exécuté au démarrage si Hibernate crée le schéma à partir de zéro (c'est-à-dire si la propriété ddl-auto est définie sur create ou create-drop). Cela peut être utile pour les démos et pour les tests si vous faites attention, mais ce n'est probablement pas quelque chose que vous voulez être sur le chemin de classe en production. C'est une fonction Hibernate (rien à voir avec Spring).

3
Moshe Arad

Vous pouvez faire comme ça

    @SpringBootApplication
    public class H2Application {

        public static void main(String[] args) {
            SpringApplication.run(H2Application.class, args);
        }

        @Bean
        CommandLineRunner init (StudentRepo studentRepo){
            return args -> {
                List<String> names = Arrays.asList("udara", "sampath");
                names.forEach(name -> studentRepo.save(new Student(name)));
            };
        }
    }
1
Udara S.S Liyanage