71 votes

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

Lors du déploiement d'applications, j'ai souvent l'utilisation de Hibernate capacité à créer de schéma de base de données afin de simplifier le déploiement. Ceci est facilement réalisable par la configuration d'hibernate.hbm2ddl.la propriété d'auto.

Toutefois, à l'occasion, j'ai aussi besoin d'insérer des données initiales de la base de données, par exemple l'utilisateur root. Est-il une manière que je pourrais obtenir ce par le biais d'hibernate avec une sorte de charge fichier texte?

Je sais que je pourrais facilement programme le code qui va le faire, mais je me demandais si il y a déjà un utilitaire qui peut m'aider à atteindre les mêmes via la configuration?

86voto

Matt Sidesinger Points 952

J'ai trouvé ça en faisant une recherche sur "Hibernate luminaires" :

Hibernate va créer la base de données lorsque l'entité gestionnaire de l'usine est créé (en fait, lors de Hibernate SessionFactory est créé par l' l'entité gestionnaire de l'usine). Si un fichier nommé à l'importation.sql existe dans la racine de le chemin de classe ('/importer.sql') Hibernate va exécuter 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 Hibernate crée le schéma il vide (supprimer toutes les tables, contraintes, ou toute autre base de données objet qui va être 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 laissez-nous savoir si cela fonctionne!

66voto

Mauro De Lucca Points 430

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 .

46voto

punseti Points 136

Ajouter de la propriété hibernate hibernate.hbm2ddl.import_files dans votre hibernate. Changement de mise en veille prolongée.hbm2ddl.la propriété d'auto pour créer. Ajouter initial_data.sql /répertoire classes initiale du code sql pour insérer des données. Hibernate exécuter ce après avoir créé un 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 voulez pas d'ajouter une propriété dans votre hibernate configuration, vous pouvez créer un fichier d'importation.sql /répertoire classes et hibernate utiliser par défaut si la propriété hibernate.hbm2ddl.l'auto est égale à créer

22voto

Markus W Mahlberg Points 783

Pourquoi hbm2ddl.auto et hbm2ddl.import_files des propriétés sont mal

(Lorsque utilisé comme un outil de base de données de gestion du changement)

Comme dit ailleurs, à l'aide de hibernate.hbm2ddl.auto et hibernate.hbm2ddl.import_files de la base de données de gestion du changement a quelques graves inconvénients:

  1. La structure peut être changée. Les valeurs existantes peuvent être remplacées ou - dans le pire des cas - simplement envoyé dans le Nirvana. Sans un outil comme liquibase ou scriptella, vous n'avez pas d' ETL capacités.
  2. Cette méthode n'a pas de transactions. À la fois la structure et les données des déclarations sera exécuté avant un gestionnaire de transactions est de prendre le relais. Disons que vous avez une erreur dans l'énoncé 42 256. Votre base de données est dans un état incohérent maintenant.
  3. Amha, tu perds de la transparence et de contrôle: lorsqu'un scriptella script ou liquibase changement ou habituellement engagé avec les changements dans les modèles de domaine, vous faites un changement dans le modèle de domaine et de l'espoir (en gros) que hibernate va savoir quoi faire. (Il n'a pas, mais c'est une autre histoire.)
  4. Pour l'intégration, de système et de test d'acceptation vous simplement supposer que votre test de bases de données sont dans le absolument, exactement le même état que votre base de données de production. Vous devez garder une trace de ce que manuellement (Bonne chance et amusez-vous! ;) ). Dans le cas où vous faites une erreur, juste un petit slip est suffisante, les résultats peuvent être très nous allons être catastrophique.

Personnellement, j'utilise liquibase pour la base de données de gestion du changement et ont développé le processus suivant afin de réduire les travaux d'entretien:

  • Créer un changelog depuis la ligne de commande de ma dernière sortie de la structure
  • Créer un "changelog" de ma dernière base de données
  • Manuellement diff les deux journaux du changement (généralement les changements ne sont pas énormes, et si elles le sont, généralement, ils répondent à l'un des défauts de liquibases diff de commande.
  • créer un ensemble de modifications

Même pour des changements complexes dans lequel on doit mettre en œuvre un customChange, cela peut être réalisé en quelques heures, y compris la définition de restaurations, les tests et la documentation. Pour des modifications insignifiantes, c'est une question de minutes. En gros: vous avez à faire un peu plus de travail (j'ai créé personnalisé les ensembles de modifications pour les 4 configurations de base de données en moins d'une journée), mais vous obtenez la tranquillité d'esprit que vous avez fait tout votre possible pour garder la base de données dans un état cohérent.

-17voto

FoxyBOA Points 3334

Ne croyez pas que Hibernate vous autorise à importer. Nous utilisons dbunit à cette fin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X