Hibernation hbm2ddl.auto valeurs possibles et ce qu'ils font?
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 lorsqu'il n'est pas? Et quelle est l'alternative?
ce sont des changements qui pourraient se produire au-dessus de DB:
- nouveaux tableaux
- nouvelles colonnes dans les anciennes tables
- colonnes supprimées
- type de données d'une colonne changé
- un type d'une colonne a changé ses attributs
- tableaux abandonnés
- valeurs d'une colonne changée
Dans chaque cas, quelle est la meilleure solution?
10 réponses
De la documentation communautaire :
mise en veille prolongée.hbm2ddl.auto valide ou exporte automatiquement le schéma DDL vers la base de données lors de la création de SessionFactory. Avec create-drop, le schéma de la base de données sera supprimé lorsque SessionFactory sera fermé explicitement.
p.ex. valider | mettre à jour | Créer /Créer-Supprimer
donc la liste des options possibles est,
- "valider : valider le schéma, n'apporte aucune modification à la base de données.
- mise à jour : mettre à jour le schéma.
- create : crée le schéma, détruisant les données précédentes.
- create-drop : supprimer le schéma lorsque le SessionFactory est fermé explicitement, typiquement lorsque l'application est arrêté.
ces options semblent destinées à être des outils de développeurs et non à faciliter les bases de données de niveau de production, vous pouvez jeter un oeil à la question suivante; Hibernate: hbm2ddl.auto=mise à jour en production?
il y a aussi la valeur non documentée de" Aucun " pour la désactiver complètement.
la propriété de configuration est appelée hibernate.hbm2ddl.auto
dans notre environnement de développement, nous définissons hibernate.hbm2ddl.auto=create-drop
pour supprimer et créer une base de données propre à chaque fois que nous déployons, de sorte que notre base de données est dans un état connu.
en théorie, vous pouvez définir hibernate.hbm2ddl.auto=update
pour mettre à jour votre base de données avec des modifications à 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 expérimental, au moins; I ne pas connaître l'état actuel.
par conséquent, pour notre base de données de production, ne pas définir hibernate.hbm2ddl.auto
- la valeur par défaut est de ne pas faire de modifications à la base de données. Au lieu de cela, nous créons manuellement un script de mise à jour DDL SQL qui applique les changements d'une version à l'autre.
j'utiliserais liquibase pour mettre à jour votre base de données. la fonctionnalité de mise à jour de schéma d'hibernate n'est vraiment que o. K. pour un développeur pendant qu'ils développent 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.
bien qu'il soit tout à fait un vieux poste, mais comme j'ai fait quelques recherches sur le sujet ainsi pensé de le partager.
mise en veille prolongée.hbm2ddl.auto
selon la documentation, il peut avoir quatre valeurs valides:
créer | mettre à jour | valider/créer-supprimer
explication du comportement de ces valeurs:
- créer :- de créer le schéma, les données déjà présentes (s'il existe) dans le schéma est perdu
- mise à jour:- mise à jour le schéma avec les valeurs données.
- Valider: - Valider le schéma. Il ne fait pas de changement dans le DB.
- create-drop:- de créer le schéma de détruire les données déjà présentes(si il existe). Il supprimez également le schéma de la base de données lorsque SessionFactory est fermé.
ce qui suit sont les points importants à noter:
- dans le cas de mise à jour , si le schéma n'est pas présent dans la base de données, alors le schéma est créé.
- dans le cas de valider , si le schéma N'existe pas dans DB, il n'est pas créé. Au lieu de cela, il va jeter une erreur: -
Table not found:<table name>
- dans le cas de create-drop , le schéma n'est pas abandonné à la clôture de la session. Il ne tombe qu'en fermant le site de la session.
-
dans le cas où je donne une valeur à cette propriété(disons abc, au lieu des quatre valeurs ci-dessus discutées) ou il est juste laissé en blanc. Il présente le comportement suivant:
- si le schéma N'est pas présent dans la DB: - It crée le schéma
- si le schéma est présent dans le DB: - mise à jour le schéma.
hibernate.hbm2ddl.auto
valide et exporte automatiquement DDL vers le schéma lors de la création de sessionFactory.
par défaut, il n'exécute aucune création ou modification automatiquement sur DB. Si l'utilisateur définit une des valeurs ci-dessous, alors il fait des changements de schéma DDL automatiquement.
-
créer-faire créer un schéma
<entry key="hibernate.hbm2ddl.auto" value="create">
-
mise à jour - mise à jour schéma existant 151960920"
<entry key="hibernate.hbm2ddl.auto" value="update">
-
valider a valider schéma existant
<entry key="hibernate.hbm2ddl.auto" value="validate">
-
create-drop - créer et supprimer le schéma automatiquement lorsqu'une session est de début et de fin
<entry key="hibernate.hbm2ddl.auto" value="create-drop">
j'ai consacré un blog post pour les communes les plus Hibernate DDL stratégies de génération :
- le
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. - le approche la plus souple doit utiliser voie de migration .
Cependant, même si vous utilisez Flyway, vous pouvez encore générer le script de migration initial en utilisant hbm2ddl. Dans cet article , vous pouvez voir comment vous pouvez combiner le modèle D'entité JPA avec le modèle de Table jOOQ.
si vous ne voulez pas utiliser de chaînes de caractères dans votre application et que vous recherchez des constantes prédéfinies, jetez un oeil à la classe org.hibernate.cfg.AvailableSettings
incluse dans le jar Hibernate, où vous trouverez une constante pour tous les réglages possibles. Dans votre cas par exemple:
/**
* Auto export/update schema using hbm2ddl tool. Valid values are <tt>update</tt>,
* <tt>create</tt>, <tt>create-drop</tt> and <tt>validate</tt>.
*/
String HBM2DDL_AUTO = "hibernate.hbm2ddl.auto";
je pense que vous devriez vous concentrer sur le
SchemaExport Class
cette classe rend votre Configuration dynamique Il vous permet donc de choisir les suites que vous préférez...
Checkout [SchemaExport]
validate
: il valide le schéma et n'apporte aucune modification au DB.
Supposons que vous avez ajouté une nouvelle colonne dans le fichier de mappage et effectuez l'opération insert, cela lancera une Exception "manquant la colonne XYZ" parce que 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 manu