Je veux vraiment en savoir plus sur la mise à jour, l'exportation et les valeurs qui pourraient être données. hibernate.hbm2ddl.auto
J'ai besoin de savoir quand utiliser la mise à jour et quand non? Et quelle est l'alternative?
Ce sont des changements qui pourraient se produire sur DB:
- nouvelles tables
- nouvelles colonnes dans les anciens tableaux
- colonnes supprimées
- type de données d'une colonne modifié
- un type de colonne a changé ses attributs
- tables supprimées
- les valeurs d'une colonne ont changé
Dans chaque cas, quelle est la meilleure solution?
Il y a aussi la valeur non documentée de "aucun" pour le désactiver complètement.
la source
La propriété de configuration est appelée
hibernate.hbm2ddl.auto
Dans notre environnement de développement, nous avons décidé
hibernate.hbm2ddl.auto=create-drop
de supprimer et de créer une base de données propre à chaque déploiement, afin que notre base de données soit dans un état connu.En théorie, vous pouvez configurer la
hibernate.hbm2ddl.auto=update
mise à jour de votre base de données avec des modifications de votre modèle, mais je ne ferais pas confiance à cela sur une base de données de production. Une version antérieure de la documentation disait que c'était du moins expérimental; Je ne connais pas l'état actuel.Par conséquent, pour notre base de données de production, ne définissez pas
hibernate.hbm2ddl.auto
- la valeur par défaut est de ne pas modifier la base de données. Au lieu de cela, nous créons manuellement un script de mise à jour SQL DDL qui applique les modifications d'une version à la suivante.la source
J'utiliserais Liquibase pour mettre à jour votre base de données. La fonctionnalité de mise à jour du schéma de hibernate n'est vraiment acceptable que pour un développeur pendant qu'il développe de nouvelles fonctionnalités. Dans une situation de production, la mise à niveau de la base de données doit être traitée avec plus de soin.
la source
Bien que ce soit un article assez ancien, mais comme j'ai fait des recherches sur le sujet, j'ai pensé à le partager.
hibernate.hbm2ddl.auto
Selon la documentation, il peut avoir quatre valeurs valides:
créer | mise à jour | valider | créer-déposer
Voici l'explication du comportement montré par ces valeurs:
Voici les points importants à noter:
Table not found:<table name>
Dans le cas où je donne une valeur à cette propriété (disons abc, au lieu des quatre valeurs décrites ci-dessus) ou si elle est simplement laissée en blanc. Il montre le comportement suivant:
-Si le schéma n'est pas présent dans la base de données: - Il crée le schéma
-Si le schéma est présent dans la base de données: - mettre à jour le schéma.
la source
Tout d'abord, les valeurs possibles pour la
hbm2ddl
propriété de configuration sont les suivantes:none
- Aucune action n'est effectuée. Le schéma ne sera pas généré.create-only
- Le schéma de base de données sera généré.drop
- Le schéma de base de données sera supprimé et créé par la suite.create
- Le schéma de base de données sera supprimé et créé par la suite.create-drop
- Le schéma de base de données sera supprimé et créé par la suite. À la fermeture de laSessionFactory
, le schéma de base de données sera supprimé.validate
- Le schéma de la base de données sera validé à l'aide des mappages d'entités.update
- Le schéma de base de données sera mis à jour en comparant le schéma de base de données existant avec les mappages d'entités.J'ai consacré un article de blog aux stratégies de génération DDL Hibernate les plus courantes :
hibernate.hbm2ddl.auto="update"
est pratique mais moins flexible si vous prévoyez d'ajouter des fonctions ou d'exécuter des scripts personnalisés.Cependant, même si vous utilisez Flyway, vous pouvez toujours générer le script de migration initial à l'aide de hbm2ddl. Dans cet article , vous pouvez voir comment combiner le modèle d'entité JPA avec le modèle de table jOOQ.
la source
hibernate.hbm2ddl.auto
valide automatiquement et exporte DDL vers le schéma lorsque la sessionFactory est créée.Par défaut, il n'effectue aucune création ou modification automatiquement sur DB. Si l'utilisateur définit l'une des valeurs ci-dessous, il effectue automatiquement des modifications de schéma DDL.
create - faire la création d'un schéma
update - mise à jour du schéma existant
valider - valider le schéma existant
create-drop - crée et supprime le schéma automatiquement au démarrage et à la fin d'une session
la source
Si vous ne souhaitez pas utiliser de chaînes dans votre application et que vous recherchez des constantes prédéfinies, consultez la
org.hibernate.cfg.AvailableSettings
classe incluse dans le fichier JAR Hibernate, où vous trouverez une constante pour tous les paramètres possibles. Dans votre cas par exemple:la source
validate
: valide le schéma, aucune modification ne se produit dans la base de données.update
: met à jour le schéma avec la requête d'exécution actuelle.create
: crée à chaque fois un nouveau schéma et détruit les données précédentes.create-drop
: supprime le schéma lorsque l'application est arrêtée ou que SessionFactory est fermé explicitement.la source
Je pense que vous devriez vous concentrer sur
cette classe rend votre configuration dynamique. Elle vous permet donc de choisir les suites qui vous conviennent le mieux ...
Commander [SchemaExport]
la source
validate
: Il valide le schéma et n'apporte aucune modification à la base de données.Supposons que vous ayez ajouté une nouvelle colonne dans le fichier de mappage et effectuez l'opération d'insertion, il lèvera une exception "manquant la colonne XYZ" car le schéma existant est différent de l'objet que vous allez insérer. Si vous modifiez le tableau en ajoutant cette nouvelle colonne manuellement, puis effectuez l'opération d'insertion, il insérera définitivement toutes les colonnes avec la nouvelle colonne dans le tableau. Signifie qu'il ne fait aucun changement / altère le schéma / table existant.
update
: il modifie la table existante dans la base de données lorsque vous effectuez l'opération. Vous pouvez ajouter ou supprimer des colonnes avec cette option de hbm2ddl. Mais si vous allez ajouter une nouvelle colonne qui n'est pas NULL, alors elle ignorera l'ajout de cette colonne particulière à la base de données. Parce que la table doit être vide si vous souhaitez ajouter une colonne 'NOT NULL' à la table existante.la source
Depuis 5.0 , vous pouvez désormais trouver ces valeurs dans un espace dédié
Enum
:org.hibernate.boot.SchemaAutoTooling
(amélioré avec la valeurNONE
depuis 5.2).Ou encore mieux, depuis la version 5.1 , vous pouvez également utiliser le qui combine les actions JPA 2 et Hibernate DDL "héritées".
org.hibernate.tool.schema.Action
Enum
Mais , vous ne pouvez pas encore configurer un
DataSource
programme avec cela. Il serait plus agréable d'utiliser ceci combiné avecorg.hibernate.cfg.AvailableSettings#HBM2DDL_AUTO
mais le code actuel attend uneString
valeur (extrait deSessionFactoryBuilderImpl
):… Et les
enum
valeurs internes des deuxorg.hibernate.boot.SchemaAutoTooling
etorg.hibernate.tool.schema.Action
ne sont pas exposées publiquement.Ci-dessous, un exemple de
DataSource
configuration programmatique (utilisée dans certaines de mes applications Spring Boot) qui utilise un gambit grâce à.name().toLowerCase()
mais cela ne fonctionne qu'avec des valeurs sans tiret (pascreate-drop
par exemple):la source
À qui recherche la valeur par défaut ...
Il est écrit dans le code source de la version 2.0.5 de spring-boot et 1.1.0 chez JpaProperties:
la source