web-dev-qa-db-fra.com

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

Je souhaite vraiment en savoir plus sur la mise à jour, l'exportation et les valeurs pouvant être attribuées à hibernate.hbm2ddl.auto
J'ai besoin de savoir quand utiliser la mise à jour et quand pas. 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 abandonnées
  • les valeurs d'une colonne ont changé

Dans chaque cas, quelle est la meilleure solution?

1018
Suzan

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 la SessionFactory. Avec create-drop, le schéma de base de données sera supprimé à la fermeture explicite de la SessionFactory.

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

Donc, la liste des options possibles est,

  • validate : valide le schéma, n'apporte aucune modification à la base de données.
  • update : met à jour le schéma.
  • create : crée le schéma en détruisant les données précédentes.
  • create-drop : supprime le schéma lorsque la SessionFactory est fermée explicitement, généralement lorsque l'application est arrêtée.

Ces options semblent être des outils pour développeurs et non pour faciliter les bases de données de production, vous pouvez jeter un coup d’œil à la question suivante; Hibernate: hbm2ddl.auto = mise à jour en production?

1018
James McMahon

Il existe également la valeur non documentée de "none" pour le désactiver complètement.

189
Michiel Verkaik

La propriété de configuration s'appelle 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 déploiement, afin que notre base de données se trouve 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 n’aurais pas confiance en cela dans une base de données de production. Une version antérieure de la documentation disait que c'é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 hibernate.hbm2ddl.auto - la valeur par défaut consiste à ne pas modifier la base de données. À la place, nous créons manuellement un script de mise à jour SQL DDL qui applique les modifications d’une version à l’autre.

153
Peter Hilton

Je voudrais utiliser liquibase pour mettre à jour votre base de données. La fonctionnalité de mise à jour de schéma d'Hibernate est vraiment seulement o.k. pour un développeur alors qu'il développe de nouvelles fonctionnalités. En situation de production, la mise à niveau de la base de données doit être traitée avec plus de soin.

51
Pat

Bien que ce soit un article assez ancien, mais comme j’ai fait quelques recherches sur le sujet, j’ai pensé à le partager.

hibernate.hbm2ddl.auto

Selon la documentation, il peut avoir quatre valeurs valides:

créer | mettre à jour | valider | créer-déposer

Voici l'explication du comportement affiché par ces valeurs:

  • create : - crée le schéma, les données précédemment présentes (le cas échéant) dans le schéma sont perdues
  • update: - met à jour le schéma avec les valeurs données.
  • valider: - valider le schéma. Cela ne change rien dans la base de données.
  • 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 la SessionFactory est fermée.

Voici les points importants à noter:

  • Dans le cas de update , si le schéma n'est pas présent dans la base de données, il est créé.
  • Dans le cas de , validez , 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>
  • Dans le cas où create-drop , le schéma n'est pas supprimé à la fermeture de la session. Il tombe seulement à la fermeture de la SessionFactory.
  • Dans le cas où je donnerais une valeur quelconque à cette propriété (par exemple abc, au lieu des quatre valeurs susmentionnées), ou si elle est laissée vide. 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: - update le schéma.

40
amit

Tout d'abord, les valeurs possibles pour la propriété de configuration hbm2ddl 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 la 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 dédié un article de blog aux stratégies de génération de DDL Hibernate les plus courantes :

  1. Le hibernate.hbm2ddl.auto="update" est pratique mais moins flexible si vous envisagez d'ajouter des fonctions ou d'exécuter des scripts personnalisés.
  2. L’approche la plus flexible consiste à utiliser voie de migration .

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.

32
Vlad Mihalcea

hibernate.hbm2ddl.auto valide et exporte automatiquement le DDL vers le schéma lors de la création de la sessionFactory.

Par défaut, aucune création ni modification n'est effectuée automatiquement sur la base de données. Si l'utilisateur définit l'une des valeurs ci-dessous, il modifie automatiquement le schéma DDL.

  • create - créer un schéma

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

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

    <entry key="hibernate.hbm2ddl.auto" value="validate">
    
  • create-drop - crée et supprime automatiquement le schéma lorsqu'une session commence et se termine

    <entry key="hibernate.hbm2ddl.auto" value="create-drop">
    
25
Vinod Kumawat

Si vous ne souhaitez pas utiliser Strings dans votre application et recherchez des constantes prédéfinies, consultez la classe org.hibernate.cfg.AvailableSettings incluse dans le fichier JAR d'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";
16
Stefan Haberl

Je pense que vous devriez vous concentrer sur le

SchemaExport Class 

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

Paiement [SchemaExport]

7
Vishal Sharma
  • validate: valide le schéma, aucun changement ne survient dans la base de données.
  • update: met à jour le schéma avec la requête en cours d'exécution.
  • create: crée un nouveau schéma à chaque fois 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.
6
vishal thakur

validate: 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 que vous effectuiez l’opération d’insertion. Une exception "levant la colonne XYZ" sera générée, car le schéma existant est différent de l’objet que vous allez insérer. Si vous modifiez la table en ajoutant cette nouvelle colonne manuellement, puis effectuez l'opération Insérer, toutes les colonnes ainsi que la nouvelle colonne seront définitivement insérées dans la table. Cela signifie qu’il n’apporte aucune modification/altération du schéma/de la table existant.

update: il modifie la table existante dans la base de données lorsque vous effectuez une opération. Vous pouvez ajouter ou supprimer des colonnes avec cette option de hbm2ddl. Mais si vous allez ajouter une nouvelle colonne qui est 'NOT NULL', il ignorera alors l'ajout de cette colonne à la base de données. Parce que la table doit être vide si vous souhaitez ajouter une colonne "NOT NULL" à la table existante.

4
Arun Raaj

Depuis la version 5.0 , vous pouvez maintenant trouver ces valeurs dans un Enum: org.hibernate.boot.SchemaAutoTooling dédié (avec la valeur NONE depuis la version 5.2).

Ou mieux encore depuis 5.1 , vous pouvez également utiliser le org.hibernate.tool.schema.ActionEnum qui combine les actions JPA 2 et "héritées" d'Hibernate DDL .

Mais , vous ne pouvez pas encore configurer un DataSource par programme avec cela. Il serait plus judicieux d’utiliser cette combinaison avec org.hibernate.cfg.AvailableSettings#HBM2DDL_AUTO mais le code actuel s’attend à une valeur String (extrait tiré de SessionFactoryBuilderImpl ):

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

… Et les valeurs internes enum de org.hibernate.boot.SchemaAutoTooling et org.hibernate.tool.schema.Action ne sont pas exposés publiquement.

Ci-dessous, un exemple de configuration programmatique DataSource (utilisée dans certaines de mes applications Spring Boot) qui utilise un gambit grâce à .name().toLowerCase() mais ne fonctionne qu'avec des valeurs sans tiret (pas create-drop par 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();
}
3
PomCompot