1260 votes

Hibernate hbm2ddl.auto valeurs possibles et ce qu'elles 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 quand ne pas le faire ? Et quelle est l'alternative ?

Ce sont des changements qui pourraient se produire au cours de la DB :

  • Nouvelles tables
  • nouvelles colonnes dans les anciens tableaux
  • colonnes supprimées
  • type de données d'une colonne modifiée
  • le type d'une colonne a changé ses attributs
  • les tables ont été abandonnées
  • les valeurs d'une colonne ont changé

Dans chaque cas, quelle est la meilleure solution ?

1233voto

James McMahon Points 14356

De la documentation communautaire :

hibernate.hbm2ddl.auto Valide ou exporte automatiquement le schéma DDL vers la base de données lorsque le SessionFactory est créé. Avec create-drop, le schéma de la base de données sera abandonné lorsque le SessionFactory sera fermé explicitement.

Par exemple : valider | mettre à jour | créer | créer-dépasser

La liste des options possibles est donc la suivante ,

  • valider : valide le schéma, n'apporte aucune modification à la base de données.
  • mise à jour : mettre à jour le schéma.
  • créer : crée le schéma, en détruisant les données précédentes.
  • créer-déposer : abandonnez le schéma à la fin de la session.

Ces options semblent destinées à être des outils pour les développeurs et non à faciliter la mise en place de bases de données de niveau production, vous pouvez consulter la question suivante ; Hibernate : hbm2ddl.auto=update en production ?

16 votes

Je viens de lire la documentation d'Hibernate ... pour les valeurs valides, il est dit : "e.g.". ... y a-t-il d'autres valeurs valides ?

1 votes

Pas à ma connaissance. Ils pourraient faire un mauvais usage, par exemple, ou les valeurs pourraient simplement être non documentées.

18 votes

Je pense que c'est écrit "e.g." parce que c'est juste une documentation communautaire, si quelqu'un est intéressé par toutes les valeurs possibles, on peut les trouver dans la javadoc d'Hibernate. (Et oui, seules ces quatre options sont présentes) docs.jboss.org/hibernate/orm/4.1/javadocs/org/hibernate/cfg/

213voto

Michiel Verkaik Points 681

Il existe également la valeur non documentée "none" pour la désactiver entièrement.

11 votes

C'est en fait très utile car la validation des schémas d'Hibernate échoue parfois pour des schémas parfaitement valides.

1 votes

J'étais sur le point de demander quelque chose comme ça. Mon intention est de réduire le temps de démarrage.

0 votes

La valeur "none" est également très utile lorsque vous souhaitez utiliser une configuration dynamique/programmatique d'Hibernate ; toute autre valeur entraînerait une erreur au démarrage de l'application.

172voto

Peter Hilton Points 10580

La propriété de configuration est appelée hibernate.hbm2ddl.auto

Dans notre environnement de développement, nous avons défini hibernate.hbm2ddl.auto=create-drop pour déposer et 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 définir hibernate.hbm2ddl.auto=update pour mettre à jour votre base de données avec les modifications apportées à votre modèle, mais je ne ferais pas confiance à cette méthode sur une base de données de production. Une version antérieure de la documentation indiquait que cela était expérimental, du moins ; je ne connais pas le statut actuel.

Par conséquent, pour notre base de données de production, ne définissez pas le paramètre hibernate.hbm2ddl.auto - le défaut est de ne faire aucune modification de la base de données. Au lieu de cela, nous créons manuellement une mise à jour SQL DDL script qui applique les changements d'une version à la suivante.

5 votes

En fait, selon la documentation, create-drop crée les tables de la base de données et les abandonne lorsque la fabrique de session est explicitement fermée. Il fait no déposer les tables lors de la création de l'usine de session.

9 votes

Non, create-drop et create déposent tous deux les tables lorsque le sessionfactory est créé, puis create-drop dépose également les tables lorsque le sessionfactory est fermé. Voir stackoverflow.com/a/6752698/1536382

0 votes

Est-ce que le fait de rendre hibernate.hbm2ddl.auto=create-drop en production peut conduire à plusieurs timeout de connexion en production ?

52voto

Pat Points 2480

J'utiliserais liquibase pour la mise à jour de votre base de données. La fonction de mise à jour des schémas d'Hibernate ne convient vraiment qu'aux développeurs qui développent de nouvelles fonctionnalités. Dans une situation de production, la mise à jour de la base de données doit être traitée avec plus de précaution.

6 votes

Voir stackoverflow.com/questions/221379/ pour savoir pourquoi vous ne devriez pas utiliser hbm2ddl pour la production.

12voto

Eyal Lupu Points 626

Il y a quelque temps, j'ai écrit une explication détaillée sur mon blog, IMO il pourrait vous aider. Jetez un coup d'œil à ici .

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