Je travaillais sur mon projet d'application Spring Boot et j'ai remarqué que, parfois, il y a une erreur de délai de connexion à ma base de données sur un autre serveur (SQL Server). Cela se produit spécialement lorsque j'essaie de faire une migration de script avec, FlyWay
mais cela fonctionne après plusieurs essais.
Ensuite, j'ai remarqué que je n'ai pas spécifié spring.jpa.hibernate.ddl-auto
dans mon fichier de propriétés. J'ai fait quelques recherches et j'ai trouvé qu'il était recommandé d'ajouter
spring.jpa.hibernate.ddl-auto= create-drop
du développement. Et changez-le en: spring.jpa.hibernate.ddl-auto= none
en production.
Mais je n'ai pas vraiment compris comment cela fonctionne vraiment et comment hibernate génère-t-il un schéma de base de données en utilisant create-drop
ou none
value. Pouvez-vous s'il vous plaît expliquer techniquement comment cela fonctionne vraiment, et quelles sont les recommandations pour l'utilisation de cette propriété en développement et sur un serveur de production. Je vous remercie
none
mais vous voudrez peut-être que vos tables Hibernate Search et Envers soient générées en utilisantupdate
puisqu'elles sont gérées en interne par ces projets et que vous ne voulez pas les gérer manuellement vous-même. À l'heure actuelle, nous contrôlons cela globalement pour toutes les tables, quelle que soit leur origine / source. Cela renforcerait la raison d'utiliser des options spécifiques au fournisseur si vous vouliez l'utiliser.Réponses:
Pour mémoire, la
spring.jpa.hibernate.ddl-auto
propriété est spécifique JPA des données Spring et est leur façon de spécifier une valeur qui finira par être transmis à Hibernate sous la propriété , il sait,hibernate.hbm2ddl.auto
.Les valeurs
create
,create-drop
,validate
etupdate
essentiellement influencent la façon dont la gestion des outils de schéma va manipuler le schéma de base de données au démarrage.Par exemple, l'
update
opération interrogera 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 en fonction de la lecture de vos classes annotées ou des mappages XML HBM et tentera d'ajuster le schéma à la volée.L'
update
opération, par exemple, tentera d'ajouter de nouvelles colonnes, contraintes, etc. mais ne supprimera jamais une colonne ou une contrainte qui aurait pu exister auparavant mais qui ne fait plus partie du modèle objet d'une exécution précédente.En règle générale, dans les scénarios de scénario de test, vous l'utiliserez probablement
create-drop
pour créer votre schéma, votre scénario de test ajoute des données fictives, vous exécutez vos tests, puis pendant le nettoyage du scénario de test, les objets de schéma sont supprimés, laissant une base de données vide.En développement, il est souvent courant de voir les développeurs utiliser
update
pour modifier automatiquement le schéma pour ajouter de nouveaux ajouts au redémarrage. Mais encore une fois, comprenez que cela ne supprime pas une colonne ou une contrainte pouvant exister lors d'exécutions précédentes qui ne sont plus nécessaires.En production, il est souvent fortement recommandé d'utiliser
none
ou simplement de ne pas spécifier cette propriété. En effet, il est courant pour les administrateurs de base de données d'examiner les scripts de migration pour les modifications de base de données, en particulier si votre base de données est partagée entre plusieurs services et applications.la source
validate
dans Production Env?validate
en production, mais il s'agit généralement d'un paramètre que vous utilisez dans votre environnement de qualité / test pour vérifier que les scripts de base de données que vous avez écrits ou appliqués à votre outil de migration de base de données sont précis. Une autre raison de ne pas l'utiliservalidate
en production est que cela pourrait être un goulot d'étranglement pendant le processus de démarrage de votre application, en particulier si votre modèle objet est assez volumineux ou si d'autres facteurs liés au réseau entrent en jeu.order
est mal interprété par l'analyseur SQL puisque c'est un mot clé s'il n'est pas échappé.