Quelles sont les valeurs possibles de la configuration Hibernate hbm2ddl.auto et que font-elles

1085

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?

Vlad Mihalcea
la source

Réponses:

1083

De la documentation de la communauté :

hibernate.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 base de données sera supprimé lorsque SessionFactory sera fermé explicitement.

par exemple valider | mise à jour | créer | créer-déposer

Donc, la liste des options possibles est,

  • valider : valider le schéma, ne modifie pas la base de données.
  • update : mettre à jour le schéma.
  • create : crée le schéma, détruisant les données précédentes.
  • create-drop : supprimez le schéma lorsque SessionFactory est fermé explicitement, généralement lorsque l'application est arrêtée.
  • aucun : ne fait rien avec le schéma, n'apporte aucune modification à la base de données

Ces options semblent destinées à être des outils de développement et non à faciliter des bases de données de niveau de production, vous voudrez peut-être jeter un œil à la question suivante; Hibernate: hbm2ddl.auto = mise à jour en production?

James McMahon
la source
14
Il suffit de lire le document d'hibernation ... pour les valeurs valides, il dit: "par exemple" ... y a-t-il d'autres valeurs valides?
Ta Sas
16
Je pense qu'il dit "par exemple" parce que c'est juste une documentation communautaire, si quelqu'un s'intéresse à toutes les valeurs possibles, il peut être trouvé dans le javadoc d'Hibernate. (Et oui, seules ces quatre options sont présentes) docs.jboss.org/hibernate/orm/4.1/javadocs/org/hibernate/cfg/…
szegedi
4
valider dit valider le schéma, qu'est-ce que cela signifie exactement ??
Hussain Akhtar Wahid 'Ghouri'
6
Vous pouvez également utiliser «aardvark», ou «pigeon» ou tout autre mot, si vous voulez que l'hibernation ne fasse rien. Non pas que je recommanderais ça bien sûr!
Ward
2
Un petit ajout à l'option create-drop. Si cette option est utilisée, elle ne supprime pas l'intégralité du schéma à la place, elle supprime les tables dont les mappages sont disponibles lors de son exécution. Par exemple, si une base de données avec le schéma S a des tables A, B, C et que le code java a des mappages pour A et B uniquement, Hibernate ne supprimera pas la table C.
Aditya
194

Il y a aussi la valeur non documentée de "aucun" pour le désactiver complètement.

Michiel Verkaik
la source
7
Ceci est en fait très utile car la validation de schéma d'Hibernate échoue parfois pour des schémas parfaitement valides.
Michael Piefel
J'étais sur le point de demander quelque chose comme ça. Mon intention est de réduire le temps de démarrage.
digao_mb
46
«chaîne vide» vaut mieux que «aucun» . Pour utiliser 'aucun', vous recevrez un message d'avertissement: org.hibernate.cfg.SettingsFactory - Valeur non reconnue pour "hibernate.hbm2ddl.auto": aucune
okwap
14
Je l'ai corrigé. "None" ajouté comme constante explicitement valide.
Sanne
9
J'aime "hibernate.hbm2ddl.auto = potato" par rapport aux autres stackoverflow.com/a/15810379/838444
Sneg
161

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-dropde 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=updatemise à 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.

Peter Hilton
la source
5
En fait, selon la documentation, create-drop crée les tables de base de données et les supprime lorsque la fabrique de sessions est explicitement fermée. Il ne supprime pas les tables lors de la création de la fabrique de sessions.
Frans
4
Non, create-drop et create drop les tables lors de la création de sessionfactory, puis create-drop supprime les tables également lorsque sessionfactory est fermé. Voir stackoverflow.com/a/6752698/1536382
Testo Testini
est-ce que la création de hibernate.hbm2ddl.auto = create-drop dans la production peut entraîner plusieurs délais de connexion en production?
METTAIBI
51

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.

Tapoter
la source
6
Voir stackoverflow.com/questions/221379/… pour savoir pourquoi vous ne devriez pas utiliser hbm2ddl pour la production.
Nathan Voxland
51

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:

  • create : - crée le schéma, les données précédemment présentes (s'il y en a) dans le schéma sont perdues
  • update: - met à jour le schéma avec les valeurs données.
  • valider: - valider le schéma. Il n'apporte aucun changement dans la DB.
  • create-drop: - crée le schéma en détruisant les données précédemment présentes (le cas échéant). Il supprime également le schéma de base de données lorsque SessionFactory est fermé.

Voici les points importants à noter:

  • En cas de mise à jour , si le schéma n'est pas présent dans la base de données, le schéma est créé.
  • En cas de validation , si le schéma n'existe pas dans la base de données, il n'est pas créé. Au lieu de cela, il générera une erreur: -Table not found:<table name>
  • En cas de création-suppression , le schéma n'est pas supprimé à la fermeture de la session. Il ne tombe qu'à la fermeture de SessionFactory.
  • 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.

amit
la source
C'est en effet un point très important que le schéma sera créé s'il n'existe pas, lorsque "update" est utilisé.
yuranos
create-drop est contredit lorsque vous comparez les instructions "Explication du comportement" et "Points importants".
VNT
2
Quelle est la différence entre mise à jour et vide ?
yashjain12yj
46

Tout d'abord, les valeurs possibles pour la hbm2ddlproprié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 la SessionFactory, 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 :

  1. 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.
  2. L' approche la plus flexible consiste à utiliser Flyway .

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.

Vlad Mihalcea
la source
27

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

    <entry key="hibernate.hbm2ddl.auto" value="create">
  • update - mise à jour du schéma existant

    <entry key="hibernate.hbm2ddl.auto" value="update">
  • valider - valider le schéma existant

    <entry key="hibernate.hbm2ddl.auto" value="validate">
  • create-drop - crée et supprime le schéma automatiquement au démarrage et à la fin d'une session

    <entry key="hibernate.hbm2ddl.auto" value="create-drop">
Vinod Kumawat
la source
2
qu'en est-il de <entry key = "hibernate.hbm2ddl.auto" value = "none">?
VNT
17

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.AvailableSettingsclasse incluse dans le fichier JAR Hibernate, où vous trouverez une constante pour tous les paramètres 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";
Stefan Haberl
la source
5
Pourquoi la référence à un fichier source de plus de 700 lignes au-dessus de la réponse directe avec près de 500 campagnols?
Pavel Niedoba
... cette question n'a aucun sens. Pourquoi y a-t-il des choses? Pourquoi suis-je même ici?
specializt
8
  • 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.
vishal thakur
la source
Quelle est la référence de la documentation «officielle»? - je me demandais juste ...
Dirk Schumacher
7

Je pense que vous devriez vous concentrer sur

SchemaExport Class 

cette classe rend votre configuration dynamique. Elle vous permet donc de choisir les suites qui vous conviennent le mieux ...

Commander [SchemaExport]

Vishal Sharma
la source
4

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.

Arun Raaj
la source
3

Depuis 5.0 , vous pouvez désormais trouver ces valeurs dans un espace dédié Enum: org.hibernate.boot.SchemaAutoTooling(amélioré avec la valeur NONEdepuis 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 DataSourceprogramme avec cela. Il serait plus agréable d'utiliser ceci combiné avec org.hibernate.cfg.AvailableSettings#HBM2DDL_AUTOmais le code actuel attend une Stringvaleur (extrait de SessionFactoryBuilderImpl):

this.schemaAutoTooling = SchemaAutoTooling.interpret( (String) configurationSettings.get( AvailableSettings.HBM2DDL_AUTO ) );

… Et les enumvaleurs internes des deux org.hibernate.boot.SchemaAutoToolinget org.hibernate.tool.schema.Actionne sont pas exposées publiquement.

Ci-dessous, un exemple de DataSourceconfiguration 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 (pas create-droppar exemple):

@Bean(name = ENTITY_MANAGER_NAME)
public LocalContainerEntityManagerFactoryBean internalEntityManagerFactory(
        EntityManagerFactoryBuilder builder,
        @Qualifier(DATA_SOURCE_NAME) DataSource internalDataSource) {

    Map<String, Object> properties = new HashMap<>();
    properties.put(AvailableSettings.HBM2DDL_AUTO, SchemaAutoTooling.CREATE.name().toLowerCase());
    properties.put(AvailableSettings.DIALECT, H2Dialect.class.getName());

    return builder
            .dataSource(internalDataSource)
            .packages(JpaModelsScanEntry.class, Jsr310JpaConverters.class)
            .persistenceUnit(PERSISTENCE_UNIT_NAME)
            .properties(properties)
            .build();
}
Doc Davluz
la source
0

À 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:

    /**
     * DDL mode. This is actually a shortcut for the "hibernate.hbm2ddl.auto"
     * property. Defaults to "create-drop" when using an embedded database and no
     * schema manager was detected. Otherwise, defaults to "none".
     */
    private String ddlAuto;
ibrahim demir
la source