test Spring / Hibernate: Insertion des données de test après la création DDL
-
25-09-2019 - |
Question
J'ai un printemps / Hibernate webapp qui a des tests d'intégration qui fonctionnent sur une base de données HSQL en mémoire. Hibernate prend cette base de données vide et crée toutes mes tables essai et contraintes grâce à hbm2ddl = créer. Cependant, j'ai un nouveau haricot qui vérifie la présence d'une valeur de configuration particulière de la base de données au cours de son procédé afterPropertiesSet (), et ainsi lorsque ce haricot est initialisé, une telle ligne doit exister dans la base de données.
est-il un bon moyen de mettre en place un équivalent Java / Spring / Hibernate des appareils de test de rail? J'essaie de trouver un moyen de dire Hibernate « à chaque fois que vous créez ce tableau, insérer ces lignes immédiatement après ». Je ne pouvais pas trouver un rappel ou un crochet, je pourrais ajouter, mais peut-être il y a une autre façon.
La solution
Je suis en train de trouver un moyen de mise en veille prolongée dire « chaque fois que vous créez ce tableau, insérer ces lignes immédiatement après »
Puisqu'Hibernate 3.1, vous pouvez inclure un fichier appelé import.sql
dans le classpath d'exécution de mise en veille prolongée et au moment de l'exportation de schéma, Hibernate exécutera les instructions SQL contenues dans ce fichier après le schéma a été exporté.
Cette fonction a été annoncé dans le blog Rotterdam JBug et Hibernate de import.sql message:
import.sql: importer facilement des données dans vos tests unitaires
Mise en veille prolongée a une petite fonctionnalité soignée qui est fortement sous-documentées et inconnu. Vous pouvez exécuter un script SQL lors de la création de
SessionFactory
juste après le schéma de base de données génération d'importer des données dans une nouvelle base de données. Vous avez juste besoin d'ajouter un fichier nomméimport.sql
dans votre classpath racine et fixé soitcreate
oucreate-drop
comme propriétéhibernate.hbm2ddl.auto
.Je l'utilise pour Hibernate Rechercher dans Action maintenant que j'ai commencé la chapitre de la requête. Initialisées mon base de données avec un nouvel ensemble de données pour mes tests unitaires. JBoss Seam utilise également beaucoup dans les divers exemples.
import.sql
est une caractéristique très simple mais il est très utile à la fois. Rappelles toi que le SQL peut dépendre votre base de données (ah portabilité!).#import.sql file delete from PRODUCTS insert into PRODUCTS (PROD_ID, ASIN, TITLE, PRICE, IMAGE_URL, DESCRIPTION) values ('1', '630522577X', 'My Fair Lady', 19.98, '630522577X.jpg', 'My Fair blah blah...'); insert into PRODUCTS (PROD_ID, ASIN, TITLE, PRICE, IMAGE_URL, DESCRIPTION) values ('2', 'B00003CXCD', 'Roman Holiday ', 12.98, 'B00003CXCD.jpg', 'We could argue that blah blah');
Pour plus d'informations sur cette fonctionnalité, consultez blog de Eyal, il a écrit une jolie petite entrée à ce sujet. Rappelez-vous si vous voulez ajouter d'autres Les objets de base de données (tables, des index et ainsi de suite), vous pouvez également utiliser l'auxiliaire disposent d'objets de base de données.
Il est toujours pas vraiment documenté.
Autres conseils
dans Hibernate 3.6 la configuration qui permet d'exécuter des commandes SQL arbitraires est:
hibernate.hbm2ddl.import_files
Voir http://docs.jboss.org /hibernate/core/3.6/reference/en-US/html_single/, remarquant qu'il ya une erreur dans la documentation:. la propriété est import_files, avec un s à la fin
Si vous parlez des tests JUnit et en utilisant AbstractTransactionalDataSourceSpringContextTests il y a des méthodes que vous pouvez remplacer comme onSetupBeforeTransaction qui fournissent un crochet pour pré-remplir les données de table de test etc.