web-dev-qa-db-fra.com

Comment importer des données initiales dans une base de données avec Hibernate?

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?

59
Dan

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!

80
Matt Sidesinger

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.

59
Mauro De Lucca

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.

42
punseti

Pourquoi les propriétés 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:

  1. Seule la structure peut être modifiée. Les valeurs existantes peuvent être écrasées ou, dans le pire des cas, simplement envoyées au Nirvana. Sans un outil tel que liquibase _ ou Scriptella , vous ne disposez d'aucune fonctionnalité ETL .
  2. Cette méthode n'a aucune transaction. La structure et les instructions de données seront exécutées avant la prise en charge par un gestionnaire de transactions. Supposons que vous avez une erreur dans l'instruction 42 sur 256. Votre base de données est actuellement dans un état incohérent.
  3. Imvho, vous perdez la transparence et le contrôle: là où un script scriptella ou un ensemble de modifications liquibase est généralement engagé avec les modifications apportées aux modèles de domaine, vous modifiez le modèle de domaine et espérez (en gros) qu'Hibernate saura quoi faire. (Ce n'est pas le cas, mais c'est une autre histoire.)
  4. Pour l'intégration, le système et le test d'acceptation, vous simplement supposez que vos bases de données de test sont dans le absolument, exactement le même état que votre base de production. Vous devez suivre cela manuellement (Bonne chance et amusez-vous avec elle!;)). Si vous faites une erreur, un simple glissement suffit, les résultats risquent d'être catastrophiques.

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:

  • Créer un journal des modifications à partir de la ligne de commande de ma dernière structure de publication
  • Créer un changelog de ma dernière base de données
  • Manually diff les deux journaux de modifications (généralement, les modifications ne sont pas très volumineuses et, si elles le sont, elles présentent généralement l'un des inconvénients de la commande liquibases diff .
  • créer un ensemble de modifications 

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.

20
Markus W Mahlberg

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
  • fichier.sql dans la racine du chemin de classe; dans mon cas, je viens de le mettre dans le dossier resources, j'utilise maven.
  • chaque commande sql sur une ligne
  • chaque fichier.sql doit avoir une ligne vide au début du fichier ==> je ne connais pas la raison de celui-ci, mais si je n'insère pas cette ligne vierge, les serveurs au moment de l'exécution me dit qu'il y a une erreur de syntaxe près du premier caractère.

J'espère que cela pourra aider.

7
jomar

Assurez-vous que votre fichier import.sql est correctement formaté. Commencez avec une déclaration d'insertion à une ligne à tester.

0
Ninja420