Guide rapide sur le chargement de données initiales avec Spring Boot

Guide rapide sur le chargement de données initiales avec Spring Boot

1. Vue d'ensemble

Spring Boot facilite grandement la gestion des modifications de notre base de données. Si nous quittons la configuration par défaut, il recherchera des entités dans nos packages et créera automatiquement les tables respectives.

Mais parfois, nous aurons besoin d'un contrôle plus fin sur les modifications de la base de données. C’est alors que nous pouvons utiliser les fichiersdata.sql etschema.sql dans Spring.

2. Le fichierdata.sql

Supposons également ici que nous travaillons avec JPA - et définissons une simple entitéCountry dans notre projet:

@Entity
public class Country {

    @Id
    @GeneratedValue(strategy = IDENTITY)
    private Integer id;

    @Column(nullable = false)
    private String name;

    //...
}

Si nous exécutons notre application,Spring Boot will create an empty table for us, but won’t populate it with anything.

Un moyen simple de le faire est de créer un fichier nommédata.sql:

INSERT INTO country (name) VALUES ('India');
INSERT INTO country (name) VALUES ('Brazil');
INSERT INTO country (name) VALUES ('USA');
INSERT INTO country (name) VALUES ('Italy');

Lorsque nous exécuterons le projet avec ce fichier sur le chemin de classe, Spring le prendra et l'utilisera pour remplir la base de données.

3. Le fichierschema.sql

Parfois, nous ne voulons pas nous fier au mécanisme de création de schéma par défaut. Dans de tels cas, nous pouvons créer un fichierschema.sql personnalisé:

CREATE TABLE country (
    id   INTEGER      NOT NULL AUTO_INCREMENT,
    name VARCHAR(128) NOT NULL,
    PRIMARY KEY (id)
);

Spring récupérera ce fichier et l’utilisera pour créer un schéma.

Il est également important de ne pas oublier de désactiver la création automatique de schéma pour éviter les conflits:

spring.jpa.hibernate.ddl-auto=none

4. Contrôle de la création de la base de données à l'aide de Hibernate

Spring fournit unproperty which Hibernate uses for DDL generation:*spring.jpa.hibernate.ddl-auto*. spécifique à JPA

Les valeurs de propriété Hibernate standard sont:create,update,create-drop,validate etnone:

  • create - Hibernate supprime d'abord les tables existantes, puis crée de nouvelles tables

  • update - le modèle d'objet créé sur la base des mappages (annotations ou XML) est comparé au schéma existant, puis Hibernate met à jour le schéma en fonction du diff. Il ne supprime jamais les tables ou colonnes existantes même si elles ne sont plus requises par l'application.

  • create-drop - similaire àcreate, avec l'ajout qu'Hibernate supprimera la base de données une fois toutes les opérations terminées. Généralement utilisé pour les tests unitaires

  • validate - Hibernate valide uniquement si les tables et colonnes existent, sinon il lève une exception

  • none - cette valeur désactive effectivement la génération DDL

Spring Boot définit par défaut cette valeur de paramètre en interne surcreate-drop si aucun gestionnaire de schéma n'a été détecté, sinonnone pour tous les autres cas.

Nous devons définir la valeur avec soin ou utiliser l'un des autres mécanismes pour initialiser la base de données.

5. @Sql

Spring fournit également l'annotation@Sql - une manière déclarative d'initialiser et de remplir notre schéma de test.

Voyons comment utiliser l'annotation@Sql pour créer une nouvelle table et également charger la table avec les données initiales pour notre test d'intégration:

@Sql({"/employees_schema.sql", "/import_employees.sql"})
public class SpringBootInitialLoadIntegrationTest {

    @Autowired
    private EmployeeRepository employeeRepository;

    @Test
    public void testLoadDataForTestClass() {
        assertEquals(3, employeeRepository.findAll().size());
    }
}

Les attributs de l'annotation@Sql sont:

  • Configuration locale deconfig – pour les scripts SQL. Nous décrivons cela en détail dans la section suivante

  • executionPhase – nous pouvons également spécifier quand exécuter les scripts, soitBEFORE_TEST_METHOD ouAFTER_TEST_METHOD

  • statements – we peut déclarer des instructions SQL en ligne à exécuter

  • scripts – we peut déclarer les chemins des fichiers de script SQL à exécuter. Ceci est un alias pour l'attributvalue 

L'annotation@Sqlcan be used at the class level or the method level. Nous pouvons charger des données supplémentaires requises pour un cas de test particulier en annotant cette méthode:

@Test
@Sql({"/import_senior_employees.sql"})
public void testLoadDataForTestCase() {
    assertEquals(5, employeeRepository.findAll().size());
}

6. @SqlConfig

Nous pouvonsconfigure the way we parse and run the SQL scripts en utilisant l'annotation@SqlConfig.

@SqlConfig peut être déclaré au niveau de la classe, où il sert de configuration globale. Ou il peut être utilisé pour configurer une annotation@Sql particulière.

Voyons un exemple où nous spécifions le codage de nos scripts SQL ainsi que le mode de transaction pour l’exécution des scripts:

@Test
@Sql(scripts = {"/import_senior_employees.sql"},
  config = @SqlConfig(encoding = "utf-8", transactionMode = TransactionMode.ISOLATED))
public void testLoadDataForTestCase() {
    assertEquals(5, employeeRepository.findAll().size());
}

Et regardons les différents attributs de@SqlConfig:

  • blockCommentStartDelimiter - délimiteur pour identifier le début des commentaires de bloc dans les fichiers de script SQL

  • blockCommentEndDelimiter - délimiteur pour indiquer la fin des commentaires de bloc dans les fichiers de script SQL

  • commentPrefix - préfixe pour identifier les commentaires sur une seule ligne dans les fichiers de script SQL

  • dataSource - nom du beanjavax.sql.DataSource sur lequel les scripts et les instructions seront exécutés

  • encoding - encodage pour les fichiers de script SQL, la valeur par défaut est l'encodage de plateforme

  • errorMode - mode qui sera utilisé lorsqu'une erreur est rencontrée lors de l'exécution des scripts

  • separator - chaîne utilisée pour séparer les instructions individuelles, la valeur par défaut est «-»

  • transactionManager - nom de bean duPlatformTransactionManager t qui sera utilisé pour les transactions

  • transactionMode - le mode qui sera utilisé lors de l'exécution de scripts en transaction

7. @SqlGroup

Java 8 et les versions ultérieures permettent l’utilisation d’annotations répétées. Cette fonction peut également être utilisée pour les annotations@Sql. Pour Java 7 et versions antérieures, il existe une annotation de conteneur -@SqlGroup. Using the @SqlGroup annotation, we can declare multiple @Sql annotations:

@SqlGroup({
  @Sql(scripts = "/employees_schema.sql",
    config = @SqlConfig(transactionMode = TransactionMode.ISOLATED)),
  @Sql("/import_employees.sql")})
public class SpringBootSqlGroupAnnotationIntegrationTest {

    @Autowired
    private EmployeeRepository employeeRepository;

    @Test
    public void testLoadDataForTestCase() {
        assertEquals(3, employeeRepository.findAll().size());
    }
}

8. Conclusion

Dans cet article rapide, nous avons vu comment nous pouvons exploiter les fichiersschema.sql etdata.sql pour configurer un schéma initial et le remplir de données. Nous avons également vu comment utiliser les annotations@Sql, @SqlConfig et@SqlGroup pour charger les données de test pour les tests.

Gardez à l'esprit que cette approche est plus adaptée aux scénarios basiques et simples, toute manipulation de base de données avancée nécessiterait des outils plus avancés et raffinés commeLiquibase ouFlyway.

Des extraits de code, comme toujours, peuvent être trouvésover on GitHub.