241 votes

Comment fonctionne exactement la propriété spring.jpa.hibernate.ddl-auto dans Spring ?

Je travaillais sur mon projet d'application Spring boot et j'ai remarqué que, parfois, il y a une erreur de temps de connexion à ma base de données sur un autre serveur (SQL Server). Cela arrive spécialement quand j'essaie de faire une migration de script avec FlyWay mais cela fonctionne après plusieurs essais.

Puis j'ai remarqué que je n'avais pas précisé spring.jpa.hibernate.ddl-auto dans mon fichier de propriétés. J'ai fait quelques recherches et j'ai trouvé qu'il est recommandé d'ajouter spring.jpa.hibernate.ddl-auto= create-drop en cours de développement. Et changez-le en : spring.jpa.hibernate.ddl-auto= none en production.

Mais je n'ai pas vraiment compris comment cela fonctionne réellement et comment hibernate génère un schéma de base de données en utilisant create-drop ou none valeur. Pouvez-vous m'expliquer techniquement comment cela fonctionne réellement, et quelles sont les recommandations pour utiliser cette propriété en développement et sur un serveur de production. Merci de votre compréhension.

1 votes

Pour info, JPA 2.1 possède une fonction standard propriété javax.persistence.schema-generation.database.action donc je ne vois pas vraiment la nécessité d'utiliser les propriétés spécifiques du fournisseur JPA pour la génération de schémas.

0 votes

@NeilStockton Une idée que nous explorons avec Hibernate 6 est la possibilité de pouvoir contrôler la génération de schémas différemment en fonction des catégories ; par exemple, vos tables orm pourraient être none mais vous pourriez vouloir que vos tables Hibernate Search et Envers soient générées à l'aide de update puisqu'ils sont gérés en interne par ces projets et que vous ne voulez pas les gérer vous-même manuellement. Actuellement, nous contrôlons cela globalement pour toutes les tables, quelle que soit leur origine/source. C'est une raison supplémentaire d'utiliser des options spécifiques au fournisseur si vous souhaitez l'utiliser.

0 votes

Cette propriété est un moyen de spécifier à Hibernate d'appliquer la DDL pour la base de données. Elle est spécifique à hibernate. Pour plus de détails, voir springhow.com/spring-boot-database-initialization

387voto

Naros Points 9211

Pour mémoire, le spring.jpa.hibernate.ddl-auto est spécifique à Spring Data JPA et constitue leur moyen de spécifier une valeur qui sera éventuellement transmise à Hibernate sous la propriété qu'il connaît, hibernate.hbm2ddl.auto .

Les valeurs create , create-drop , validate y update influencent fondamentalement la façon dont la gestion de l'outil de schéma va manipuler le schéma de la base de données au démarrage.

Par exemple, le update interroge l'API du pilote JDBC pour obtenir les métadonnées de la base de données, puis Hibernate compare le modèle d'objet qu'il crée à partir de la lecture de vos classes annotées ou des mappages XML HBM et tente d'ajuster le schéma à la volée.

En update par exemple, tentera d'ajouter de nouvelles colonnes, de nouvelles contraintes, etc., mais ne supprimera jamais une colonne ou une contrainte qui a pu exister auparavant mais qui ne fait plus partie du modèle d'objet d'une exécution antérieure.

Typiquement, dans les scénarios de test, vous utiliserez probablement create-drop de sorte que vous créez votre schéma, votre scénario de test ajoute quelques données fictives, vous exécutez vos tests, puis lors du nettoyage du scénario de test, les objets du schéma sont supprimés, laissant une base de données vide.

Dans le développement, il est souvent courant de voir les développeurs utiliser update pour modifier automatiquement le schéma afin d'ajouter de nouveaux ajouts lors du redémarrage. Mais comprenez bien que cela ne supprime pas une colonne ou une contrainte qui peut exister à partir d'exécutions précédentes et qui n'est plus nécessaire.

En production, il est souvent fortement recommandé d'utiliser none ou simplement ne pas spécifier cette propriété. C'est parce que c'est une pratique courante pour les DBA d'examiner les scripts de migration pour les changements de base de données, en particulier si votre base de données est partagée entre plusieurs services et applications.

23 votes

Oui, n'utilisez jamais la génération de ddl en production. Nous générons les scripts initiaux pour la structure de la table en utilisant ddl, et nous impliquons le DBA dans le processus. Nous incluons ensuite les scripts de la db comme partie de l'unité de déploiement, et les exécutons en utilisant Flyway lorsque l'application est déployée. Lorsque nous devons modifier la base de données, nous ajoutons de nouveaux scripts à la prochaine version de l'application et nous déployons vers staging. Flyway détectera automatiquement la version actuelle et exécutera les scripts nécessaires pour amener la base de données à la version la plus récente. Si tout fonctionne nous déployons en production.

2 votes

Que se passe-t-il si nous ne spécifions pas cette propriété ? Par exemple, j'ai mon propre <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> ... <prop key="hibernate.hbm2ddl.auto">update</prop> J'avais ceci et pour une raison quelconque mes tables étaient toujours abandonnées, jusqu'à ce que j'ajoute la propriété mentionnée ci-dessus; ; ps : désolé pour l'échantillon de code ;)

0 votes

J'avais H2 et Spring Boot a décidé qu'il devait utiliser "create-drop", et je suppose que cela remplace la propriété que j'ai définie. docs.spring.io/spring-boot/docs/current/reference/html/

36voto

Md. Kawser Habib Points 1366

Dans Spring/Spring-Boot, la base de données SQL peut être initialisée de différentes manières en fonction de votre pile.

JPA dispose de fonctions de génération de DDL, qui peuvent être configurées pour s'exécuter au démarrage sur la base de données. Ceci est contrôlé par deux propriétés externes :

  • spring.jpa.generate-ddl (booléen) active ou désactive la fonction et est indépendant du fournisseur.
  • spring.jpa.hibernate.ddl-auto (enum) est une fonctionnalité d'Hibernate qui contrôle le comportement de manière plus fine. Voir ci-dessous pour plus de détails.

Les valeurs des propriétés Hibernate sont : create, update, create-drop, validate et none :

  • create - Hibernate supprime d'abord les tables existantes, puis crée de nouvelles tables.
  • mise à jour - le modèle d'objet créé à partir des mappings (annotations ou XML) est comparé au schéma existant, puis Hibernate met à jour le schéma en fonction de la différence. Il ne supprime jamais les tables ou les colonnes existantes, même si elles ne sont plus requises par l'application.
  • create-drop - similaire à create, mais Hibernate abandonne 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 l'existence des tables et des colonnes, sinon il lève une exception.
  • none - cette valeur désactive effectivement la génération de DDL

Spring Boot attribue par défaut à ce paramètre la valeur create-drop si aucun gestionnaire de schémas n'a été détecté, et aucune valeur dans tous les autres cas.

1voto

dennisiluma Points 21

"spring.jpa.hibernate.ddl-auto= create-drop" signifie que lorsque le serveur est exécuté, l'instance de la base de données (table) est créée. Et lorsque le serveur s'arrête, l'instance de la table de la base de données est abandonnée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X