Je me demande quelle est la meilleure façon de charger les données initiales de la base de données avant le démarrage de l'application? Ce que je recherche, c'est quelque chose qui remplira ma base de données H2 de données.
Par exemple, j'ai un modèle de domaine "Utilisateur". Je peux accéder aux utilisateurs en accédant à / users mais au départ il n'y aura pas d'utilisateurs dans la base de données donc je dois les créer. Est-il possible de remplir automatiquement la base de données avec des données?
Pour le 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 procéder. Ou est-ce?
spring
spring-boot
spring-data
Lithicas
la source
la source
data.sql
et / ouschema.sql
initier des données .. Tout cela est documenté dans le guide de référence (que je suggère de lire).Réponses:
Vous pouvez simplement créer un fichier data.sql 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:
De même, vous pouvez également créer un fichier schema.sql (ou schema-h2.sql) pour créer votre schéma:
Bien que normalement, vous ne devriez pas avoir à le faire car Spring Boot configure déjà Hibernate pour créer votre schéma en fonction de vos entités pour une base de données en mémoire. Si vous voulez vraiment utiliser schema.sql, vous devrez désactiver cette fonctionnalité en l'ajoutant à votre application.properties:
Plus d'informations peuvent être trouvées dans la documentation sur l' initialisation de la base de données .
Si vous utilisez Spring boot 2 , l'initialisation de la base de données ne fonctionne que pour les bases de données embarquées (H2, HSQLDB, ...). Si vous souhaitez également l'utiliser pour d'autres bases de données, vous devez modifier la
spring.datasource.initialization-mode
propriété:Si vous utilisez plusieurs fournisseurs de bases de données, vous pouvez nommer votre fichier data-h2.sql ou data-mysql.sql en fonction de la plate-forme de base de données que vous souhaitez utiliser.
Pour que cela fonctionne, vous devrez configurer la
spring.datasource.platform
propriété:la source
schema.sql
/data.sql
seront exécutés quandspring.datasource.initialize
esttrue
(qui est la valeur par défaut).spring.jpa.hibernate.ddl-auto
peut être utilisé pour générer vos tables en fonction de la configuration de votre entité plutôt qu'en utilisant un fichier SQL. Ceci est activé par défaut sur les bases de données en mémoire. C'est pourquoi j'ai ajouté la note dans ma réponse, expliquant que si vous utilisez une base de données en mémoire et que vous souhaitez utiliser leschema.sql
, vous devez désactiver,spring.jpa.hibernate.ddl-auto
sinon les deux essaieront de créer votre table.data-h2.sql
nom de fichier pour vos données initiales, vous devez également définirspring.datasource.platform=h2
les propriétés de votre application.org.h2.jdbc.JdbcSQLException
exception -exception, car les données sont déjà présentes dans la base de données. J'utilise une base de données H2 intégrée, mais le problème reste le même.MERGE INTO
. J'ai compris qu'il existe un moyen de contourner cela en utilisant un fichier import.sql au lieu d'un data.sql . Il nécessitespring.jpa.hibernate.ddl-auto
de créer ou de créer-déposer . Ensuite, chaque fois que le fichier de schéma est créé (et / ou qu'un schema.sql est exécuté), le fichier import.sql est également exécuté. Pourtant: cela ressemble à une solution de contournement et non à une implémentation propre de la création de données init.Si je veux simplement insérer des données de test simples, j'implémente souvent un fichier
ApplicationRunner
. Les implémentations de cette interface sont exécutées au démarrage de l'application et peuvent utiliser par exemple un référentiel auto-câblé 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 ressemblerait à qc. comme ça:
la source
Vous pouvez ajouter une
spring.datasource.data
propriété pourapplication.properties
répertorier les fichiers SQL que vous souhaitez exécuter. Comme ça:Les instructions d'insertion SQL dans chacun de ces fichiers seront ensuite exécutées, vous permettant de garder les choses en ordre.
Si vous placez les fichiers dans le classpath, par exemple,
src/main/resources
ils seront appliqués. Ou remplacezclasspath:
parfile:
et utilisez un chemin absolu vers le fichierla source
file:
place declasspath:
.Comme suggestion, essayez ceci:
Option 2: initialiser avec des scripts de schéma et de données
Prérequis: dans
application.properties
vous devez mentionner ceci:spring.jpa.hibernate.ddl-auto=none
(sinon les scripts seront ignorés par hibernate, et il analysera le projet pour@Entity
et / ou les@Table
classes annotées)Ensuite, dans votre
MyApplication
classe, collez ceci:Emplacement du
scripts
dossier sous leresources
dossier (IntelliJ Idea)J'espère que ça aide quelqu'un
la source
Vous pouvez utiliser quelque chose comme ceci:
la source
Spring Boot vous permet d'utiliser un script simple pour initialiser votre base de données, à l'aide de Spring Batch .
Néanmoins, si vous souhaitez utiliser quelque chose d'un peu plus élaboré pour gérer les versions de base de données, etc., Spring Boot s'intègre bien à Flyway .
Voir également:
la source
Dans Spring Boot 2 data.sql ne fonctionnait pas avec moi comme dans Spring Boot 1.5
De plus, un fichier nommé
import.sql
à la racine du chemin de classe est 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).Remarque très important si vous insérez les clés ne peuvent pas être dupliquées, n'utilisez pas la propriété ddl-auto est définie sur mise à jour car à chaque redémarrage, les mêmes données seront à nouveau insérées
Pour plus d'informations, visitez le site Web du printemps
https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html
la source
Voici comment je l'ai obtenu:
Merci à l'auteur de cet article:
http://blog.netgloo.com/2014/11/13/run-code-at-spring-boot-startup/
la source
Vous pouvez simplement créer un
import.sql
fichier danssrc/main/resources
et Hibernate l'exécutera lorsque le schéma sera créé.la source
J'ai résolu un problème similaire de cette façon:
la source
Si quelqu'un a du mal à faire fonctionner cela même en suivant la réponse acceptée , pour moi, je ne travaille qu'en ajoutant mes détails
src/test/resources/application.yml
H2datasource
:la source
vous pouvez vous inscrire et écouter l'événement pour y parvenir comme ci-dessous:
Lorsque le ContextRefreshEvent est déclenché, nous avons accès à tous les beans câblés automatiquement dans l'application, y compris les modèles et les référentiels.
la source
Si vous voulez insérer seulement quelques lignes et que vous avez JPA Setup. Vous pouvez utiliser ci-dessous
la source
Cela fonctionnera également.
la source
La solution la plus compacte (pour les données dynamiques) met @ mathias-dpunkt dans MainApp (avec Lombok
@AllArgsConstructor
):la source
Tu y es presque!
la source
Vous pouvez utiliser le code ci-dessous. Dans le code suivant, une insertion de base de données se produit lors du démarrage de l'application Spring Boot.
la source