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:
Dans chaque cas, quelle est la meilleure solution?
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,
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?
Il existe également la valeur non documentée de "none" pour le désactiver complètement.
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.
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.
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:
Voici les points importants à noter:
Table not found:<table name>
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.
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 :
hibernate.hbm2ddl.auto="update"
est pratique mais moins flexible si vous envisagez 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.
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">
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";
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]
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.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.
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.Action
Enum
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();
}