Spring Boot – Chargement des données initiales

Je me demande quel est le meilleur moyen de charger les données de la firebase database initiale avant le démarrage de l’application? Ce que je recherche, c’est quelque chose qui remplira ma firebase database H2 avec des données.

Par exemple, j’ai un modèle de domaine “Utilisateur” Je peux accéder aux utilisateurs en allant sur / utilisateurs, mais dans un premier temps, il n’y aura plus d’utilisateurs dans la firebase database. Je dois donc les créer. Y a-t-il un moyen de remplir automatiquement la firebase database avec des données?

En ce moment, j’ai un Bean qui est instancié par le conteneur et crée des utilisateurs pour moi.

Exemple:

@Component public class DataLoader { private UserRepository userRepository; @Autowired public DataLoader(UserRepository userRepository) { this.userRepository = userRepository; LoadUsers(); } private void LoadUsers() { userRepository.save(new User("lala", "lala", "lala")); } } 

Mais je doute fort que ce soit la meilleure façon de le faire. Ou est-ce?

Vous pouvez simplement créer un fichier data.sql (ou data-h2.sql si vous voulez seulement qu’il soit appliqué dans le cas où H2 est votre firebase database) dans votre dossier src / main / resources et il sera automatiquement exécuté au démarrage. Dans ce fichier, vous ajoutez simplement des instructions d’insertion, par exemple:

 INSERT INTO users (username, firstname, lastname) VALUES ('lala', 'lala', 'lala'), ('lolo', 'lolo', 'lolo'); 

De même, vous pouvez créer un fichier schema.sql (ou schema-h2.sql) pour créer votre schéma:

 CREATE TABLE task ( id INTEGER PRIMARY KEY, description VARCHAR(64) NOT NULL, completed BIT NOT NULL); 

Bien que normalement vous ne devriez pas avoir à le faire puisque le démarrage de Spring configure déjà Hibernate pour créer votre schéma basé sur vos entités pour une firebase database en mémoire. Si vous voulez vraiment utiliser schema.sql, vous devez désactiver cette fonctionnalité en l’ajoutant à votre application.properties:

 spring.jpa.hibernate.ddl-auto=none 

Plus d’informations peuvent être trouvées dans la documentation sur l’ initialisation de la firebase database .


Si vous utilisez Spring boot 2 , l’initialisation de la firebase database ne fonctionne que pour les bases de données intégrées (H2, HSQLDB, …). Si vous souhaitez également l’utiliser pour d’autres bases de données, vous devez modifier la propriété spring.datasource.initialization-mode :

 spring.datasource.initialization-mode=always 

Si je veux juste insérer des données de test simples, j’implémente souvent un ApplicationRunner . Les implémentations de cette interface sont exécutées au démarrage de l’application et peuvent, par exemple, utiliser un référentiel automatique pour insérer des données de test.

Je pense qu’une telle implémentation serait légèrement plus explicite que la vôtre car l’interface implique que votre implémentation contient quelque chose que vous aimeriez faire directement après que votre application soit prête.

Votre implémentation aurait l’air sth. comme ça:

 @Component public class DataLoader implements ApplicationRunner { private UserRepository userRepository; @Autowired public DataLoader(UserRepository userRepository) { this.userRepository = userRepository; } public void run(ApplicationArguments args) { userRepository.save(new User("lala", "lala", "lala")); } } 

Comme suggestion essayez ceci:

 @Bean public CommandLineRunner loadData(CustomerRepository repository) { return (args) -> { // save a couple of customers repository.save(new Customer("Jack", "Bauer")); repository.save(new Customer("Chloe", "O'Brian")); repository.save(new Customer("Kim", "Bauer")); repository.save(new Customer("David", "Palmer")); repository.save(new Customer("Michelle", "Dessler")); // fetch all customers log.info("Customers found with findAll():"); log.info("-------------------------------"); for (Customer customer : repository.findAll()) { log.info(customer.toSsortingng()); } log.info(""); // fetch an individual customer by ID Customer customer = repository.findOne(1L); log.info("Customer found with findOne(1L):"); log.info("--------------------------------"); log.info(customer.toSsortingng()); log.info(""); // fetch customers by last name log.info("Customer found with findByLastNameStartsWithIgnoreCase('Bauer'):"); log.info("--------------------------------------------"); for (Customer bauer : repository .findByLastNameStartsWithIgnoreCase("Bauer")) { log.info(bauer.toSsortingng()); } log.info(""); } } 

Option 2: initialiser avec le schéma et les scripts de données

Conditions préalables: dans application.properties vous devez mentionner ceci:

spring.jpa.hibernate.ddl-auto=none (sinon les scripts seront ignorés par hibernate, et ils scanneront le projet pour les classes annotées @Entity et / ou @Table )

Ensuite, dans votre classe MyApplication , collez ceci:

 @Bean(name = "dataSource") public DriverManagerDataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("org.h2.Driver"); dataSource.setUrl("jdbc:h2:~/myDB;MV_STORE=false"); dataSource.setUsername("sa"); dataSource.setPassword(""); // schema init Resource initSchema = new ClassPathResource("scripts/schema-h2.sql"); Resource initData = new ClassPathResource("scripts/data-h2.sql"); DatabasePopulator databasePopulator = new ResourceDatabasePopulator(initSchema, initData); DatabasePopulatorUtils.execute(databasePopulator, dataSource); return dataSource; } 

Où le dossier de scripts est situé dans le dossier de resources (IntelliJ Idea)

J’espère que ça aide quelqu’un

Spring Boot vous permet d’utiliser un script simple pour initialiser votre firebase database, en utilisant Spring Batch .

Cependant, si vous souhaitez utiliser quelque chose de plus élaboré pour gérer les versions de firebase database, etc., Spring Boot s’intègre bien avec Flyway .

Voir également:

  • Initialisation de la firebase database Spring Boot

Voici comment je suis arrivé:

 @Component public class ApplicationStartup implements ApplicationListener { /** * This event is executed as late as conceivably possible to indicate that * the application is ready to service requests. */ @Autowired private MovieRepositoryImpl movieRepository; @Override public void onApplicationEvent(final ApplicationReadyEvent event) { seedData(); } private void seedData() { movieRepository.save(new Movie("Example")); // ... add more code } } 

Merci à l’auteur de cet article:

http://blog.netgloo.com/2014/11/13/run-code-at-spring-boot-startup/

Vous pouvez utiliser quelque chose comme ceci:

 @SpringBootApplication public class Application { @Autowired private UserRepository userRepository; public static void main(Ssortingng[] args) { SpringApplication.run(Application.class, args); } @Bean InitializingBean sendDatabase() { return () -> { userRepository.save(new User("John")); userRepository.save(new User("Rambo")); }; } } 

Vous pouvez append une propriété spring.datasource.data à application.properties répertoriant les fichiers sql à exécuter. Comme ça:

 spring.datasource.data=classpath:accounts.sql, classpath:books.sql, classpath:reviews.sql 

Les instructions d’insertion SQL dans chacun de ces fichiers seront alors exécutées, vous permettant de garder les choses en ordre

Vous pouvez simplement créer un fichier import.sql dans src/main/resources et Hibernate l’exécutera lors de la création du schéma.

vous pouvez vous inscrire et même auditeur pour atteindre ce que ci-dessous:

 @EventListener public void seed(ContextRefreshedEvent event) { userRepository.save(new User("lala", "lala", "lala")); } 

Lorsque ContextRefreshEvent est déclenché, nous accédons à tous les beans auto-générés de l’application, y compris les modèles et les référentiels.

Cela fonctionnera également.

  @Bean CommandLineRunner init (StudentRepo studentRepo){ return args -> { // Adding two students objects List names = Arrays.asList("udara", "sampath"); names.forEach(name -> studentRepo.save(new Student(name))); }; } 

La plus compacte (pour les données dynamics) met la solution @ mathias-dpunkt dans MainApp (avec Lombok @AllArgsConstructor ):

 @SpringBootApplication @AllArgsConstructor public class RestaurantVotingApplication implements ApplicationRunner { private final VoteRepository voteRepository; private final UserRepository userRepository; public static void main(Ssortingng[] args) { SpringApplication.run(RestaurantVotingApplication.class, args); } @Override public void run(ApplicationArguments args) { voteRepository.save(new Vote(userRepository.getOne(1), LocalDate.now(), LocalTime.now())); } } 

Si quelqu’un a du mal à faire fonctionner ceci même après la réponse acceptée , pour moi, je ne travaille qu’à append dans ma src/test/resources/application.yml les détails de la datasource H2:

 spring: datasource: platform: h2 url: jdbc:h2:mem:test;DB_CLOSE_DELAY=-1 driver-class-name: org.h2.Driver username: sa password: