Lors du déploiement d’applications, j’utilise souvent la capacité d’Hibernate pour créer un schéma de base de données afin de simplifier le déploiement. Ceci est facilement réalisable en configurant la propriété hibernate.hbm2ddl.auto.
Cependant, à l'occasion, j'ai également besoin d'insérer des données initiales dans la base de données, par exemple l'utilisateur root. Est-il possible de réaliser cela en mode hibernation avec une sorte de fichier texte de chargement?
Je sais que je pourrais facilement programmer le code qui le fera, mais je me demandais simplement s'il existait déjà un utilitaire pouvant m'aider à atteindre le même objectif via la configuration?
J'ai trouvé cela en faisant une recherche sur "Hibernate fixtures":
Hibernate créera la base de données lorsque la fabrique de gestionnaires d'entités est .__ créé (en fait, lorsque la SessionFactory d’Hibernate est créée par la fabrique de gestionnaires d’entités ). Si un fichier nommé import.sql existe dans la racine de le chemin de classe ('/import.sql') Hibernate exécutera le SQL déclarations lues à partir du fichier après la création du schéma de base de données . Il est important de se rappeler que avant qu'Hibernate crée le schéma il le vide (supprime toutes les tables, les contraintes ou tout autre objet de la base de données .__ qui sera créé dans le processus de construction du schéma .__).
Source: http://www.velocityreviews.com/forums/t667849-hibernate-quotfixturesquot-or-database-population.html
Essayez-le et dites-nous si cela fonctionne!
Ajouter import.sql au chemin de classe fonctionne très bien, hbm2ddl vérifie si le fichier existe et l’exécute. Le seul détail supplémentaire est que chaque commande SQL doit être sur sa propre ligne, sinon son exécution échouera.
Cela fonctionnera également uniquement si hbm2ddl.auto
est défini sur create
ou create-drop
.
Ajoutez la propriété hibernate hibernate.hbm2ddl.import_files dans votre configuration hibernate . Modifiez la propriété hibernate.hbm2ddl.auto pour créer . Ajoutez le répertoire initial_data.sql dans/classes avec le code SQL initial insert data . Hibernate l'exécute après la création du schéma de base de données.
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.hbm2ddl.auto">create</prop>
<prop key="hibernate.hbm2ddl.import_files">initial_data.sql</prop>
</props>
</property>
</bean>
Si vous ne souhaitez pas ajouter une propriété dans votre configuration hibernate, vous pouvez créer un fichier import.sql dans le répertoire/classes et hibernate l'utilisera par défaut si la propriété hibernate.hbm2ddl.auto est égale à créer.
hbm2ddl.auto
et hbm2ddl.import_files
sont diaboliques(Utilisé à mauvais escient comme outil de gestion des modifications de base de données)
Comme dit ailleurs , utiliser hibernate.hbm2ddl.auto
et hibernate.hbm2ddl.import_files
pour la gestion des modifications de la base de données présente quelques inconvénients graves:
J'utilise personnellement liquibase pour la gestion des modifications de base de données et j'ai développé le workflow suivant pour réduire le travail de maintenance:
Même pour les changements compliqués dans lesquels on doit implémenter un customChange , ceci peut être réalisé en quelques heures, incluant la définition des restaurations, des tests et de la documentation. Pour les changements triviaux, c'est une question de minutes. En gros: vous devez faire un peu plus de travail (j'ai créé des jeux de modifications personnalisés pour 4 configurations de base de données en moins d'une journée), mais vous avez la tranquillité d'esprit de faire tout ce qui est possible pour maintenir la base de données dans un état cohérent.
Après avoir passé quelques heures avec ça, j'ai décidé de partager ce que j'ai trouvé, bien que ce soit un très vieux billet.
Pour que cela fonctionne correctement, je devais faire ce qui suit:
hbmddl
défini sur create
ou create-drop
resources
, j'utilise maven.J'espère que cela pourra aider.
Assurez-vous que votre fichier import.sql est correctement formaté. Commencez avec une déclaration d'insertion à une ligne à tester.