Comment faire pour remplir Java (web) application avec données initiales à l'aide de Spring/JPA/Hibernate
Je veux configurer ma base de données avec des données initiales de la programmation. Je veux remplir ma base de données pour le développement s'exécute, pas pour le test fonctionne (c'est facile). Le produit est construit sur le sommet de Printemps et JPA/Hibernate.
- Développeur récupère le projet
- Développeur exécute la commande/script de configuration de la base de données avec des données initiales
- Développeur commence application (serveur) et commence le développement/tests
alors:
- Développeur exécute la commande/script pour vider la base de données et le mettre en place avec de nouvelles données initiales parce que les structures de base de données ou l'initiale de l'ensemble de données ont été modifiées
Ce que je veux, c'est l'installation de mon environnement par les pièces nécessaires afin d'appeler mon DAOs et insérer de nouveaux objets dans la base de données. Je ne veux pas créer des ensembles de données initiales en raw, SQL, XML, prendre des dumps de la base de données ou que ce soit. Je veux de programmation pour créer des objets et de les conserver dans la base de données que je voudrais dans l'application normale de la logique.
Une façon d'y parvenir serait de commencer ma demande normalement et exécuter un spécial servlet qui ne l'initialisation. Mais est-ce vraiment la voie à suivre? J'aimerais exécuter les données initiales de la configuration que Maven tâche et je ne sais pas comment faire si je prends la servlet approche.
Il est un peu la même question. J'ai pris un coup d'oeil rapide à l'a suggéré DBUnit et Unitils. Mais ils semblent être fortement concentrés dans la mise en place d'environnements de tests, ce qui n'est pas ce que je veux ici. DBUnit n'données initiales de la population, mais seulement à l'aide de xml/csv luminaires, ce qui n'est pas ce que je suis après ici. Ensuite, Maven a SQL plugin, mais je ne veux pas gérer SQL brut. Maven a également Hibernate plugin, mais il semble pour aider seulement dans Hibernate configuration et le schéma de la table la création (pas dans le remplissage de db avec les données).
Comment faire?
Solution partielle 2010-03-19
Solutions de rechange proposées sont:
- L'aide de tests unitaires pour remplir la base de données #2423663
- À l'aide de ServletContextListener de contrôle de gain sur le web contexte de démarrage #2424943 et #2423874
- À l'aide de Printemps ApplicationListener et du Printemps, les Événements Standard et Personnalisés #2423874
Je l'ai fait à l'aide du Printemps ApplicationListener:
Classe:
public class ApplicationContextListener implements ApplicationListener {
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof ContextRefreshedEvent) {
...check if database is already populated, if not, populate it...
}
}
}
applicationContext.xml:
<bean id="applicationContextListener" class="my.namespaces.ApplicationContextListener" />
Pour une raison que je ne pouvais pas obtenir ContextStartedEvent lancé, j'ai donc choisi ContextRefreshedEvent qui est lancé au démarrage (n'ai pas croisé d'autres situations, encore).
Comment puis-je vider la base de données? Actuellement, j'ai simplement supprimer HSQLDB artefacts et un nouveau schéma est généré au démarrage par Hibernate. Le DB est alors aussi vide.
OriginalL'auteur Tuukka Mustonen | 2010-03-11
Vous devez vous connecter pour publier un commentaire.
Vous pouvez écrire un test unitaire pour remplir la base de données, en utilisant JPA et la plaine de Java. Ce test serait appelé par Maven dans le cadre de la version standard du cycle de vie.
Comme un résultat, vous obtiendrez une entièrement initialisé base de données, à l'aide de Maven, JPA et Java comme demandé.
Eh bien, vous avez voulu être une partie du cycle de vie de Maven, j'ai donc proposé cette approche. Mais si cette exigence peut être levée, l'unité de test est définitivement pas ce que je vous recommande. Vous pouvez le faire avec une Servlet comme vous le suggérez, avec un ServletContextListener si vous voulez la DB pour être rempli automatiquement au démarrage de l'application. BTW, si vous utilisez une Servlet, rappelez-vous d'installer une sorte de sécurité pour éviter des gens au hasard de jouer avec votre base de données...
OriginalL'auteur Olivier Croisier
La façon habituelle de faire cela est d'utiliser un script SQL. Alors vous exécuter le fichier bash qui peuplent la db à l'aide de votre .sql
Si vous voulez être en mesure de définir par programmation de votre DB pendant la WebApp de Démarrage vous pouvez utiliser un Contexte Web Listener.
Lors de l'initialisation de votre webContext vous pouvez utiliser une Servlet Contexte Auditeur d'obtenir l'accès à votre DAO (Couche de Service.. que ce soit) créer votre entités et de les conserver en tant que vous utilisez pour faire dans votre code java
p.s. comme une référence Servlet Cycle De Vie
Si vous utilisez Printemps, vous devriez jeter un oeil à la Les Événements Standard et Personnalisés section de la Référence. C'est une meilleure façon de mettre en œuvre un "Printemps de l'Auditeur", qui est conscient de Printemps du Contexte (dans le cas où vous avez besoin de récupérer vos Services de celle-ci)
Oui, une variable passée dans au démarrage doit être fine. C'est un écouteur qui est utilisé lorsque le contexte est commencé, vous n'avez pas besoin de tuer tous les processus. Il est plus facile d'accéder à la fève définis dans votre printemps contexte etc. Votre source xml de config devrait être ok lorsque vous atteignez ContextStartedEvent.. C'est la 1ere place je mettrais ma logique à persister réel entités à l'aide du Ressort des services.. il devrait être facile et rapide à développer.. lui donner un essai
Quelqu'un a abordé le problème ici? Pourquoi n'est-ce pas le Printemps de tir jusqu'à un ContextStartedEvent lorsque le contexte est lancé?
OriginalL'auteur mickthompson
Vous pouvez créer des entités JPA dans un pur Java de la classe et de les conserver. Cette classe peut être invoqué par un servlet, mais également une
main
méthode et être invoquée sur la ligne de commande, par maven (avec la commande Exec Plugin Maven) ou encore enveloppé comme un plugin Maven.Mais vous êtes final de flux de travail n'est pas clair (voulez-vous l'init pour faire partie du démarrage de l'application ou de fait lors de la compilation?) et appelle quelques précisions.
OriginalL'auteur Pascal Thivent
Je nous un Singleton bean:
OriginalL'auteur Martijn Burger
Dépendent de votre db. Il est préférable d'avoir un script pour configurer db
OriginalL'auteur Artic
ServletContextListener
ou dans une commune de démarrage lieu de mettre tous le prochain codeWebApplicationContextUtils.getRequiredWebApplicationContext().getBean(..)
) , itérer tous les objets prédéfinis et de les conserver via leEntityManager
dans la base de données.OriginalL'auteur Bozho
Je vais avoir le même problème. J'ai essayé d'utiliser une initialisation de la méthode sur le haricot, mais qui s'exécute sur la fève brute w/o AOP et ne peut donc pas utiliser @Transactionnelle. Le même semble aller pour @PostConstruct et l'autre bean cycle de vie du mécanisme.
Donné que je suis passé à ApplicationListener w/ContextRefreshedEvent; toutefois, dans ce cas, @PersistenceContext est de ne pas en obtenir un gestionnaire d'entité
À l'aide de printemps 2.0.8, jpa1, hibernate 3.0.5.
Je suis tenté de créer un non-printemps géré entitymanagerfactory et de tout faire directement, mais la peur qui pourrait interférer w/le reste du Printemps entité gérée et gestionnaire de transactions.
OriginalL'auteur DHM
Je ne suis pas sûr si vous pouvez obtenir loin de l'aide de SQL. Cela dépend si votre develoeprs sont fixés avec une base de données vide avec aucun schéma défini ou si les tables sont là, mais ils sont vides.
Si vous commencer avec des tables vides, alors vous pourriez utiliser un Java approche pour la génération de données. Je ne suis pas familier avec Maven, mais je suppose que vous pouvez créer une tâche qui serait d'utiliser vos classes DAO pour générer les données. Vous pourriez probablement même l'écrire à l'aide d'une JVM langage de script basé sur, comme Groovy qui serait en mesure d'utiliser vos classes DAO directement. Vous avez une tâche similaire qui permettrait d'effacer les données à partir des tables. Alors à vos développeurs serait tout simplement de l'exécution de ces tâches sur la ligne de commande ou par le biais de leurs IDE comme une étape manuelle après le paiement.
Si vous avez une nouvelle instance de base de données que je pense que vous aurez besoin pour exécuter SQL juste pour créer le schéma. Vous pourrait techniquement faire avec de l'exécution de SQL appels avec hibernate, mais ça ne semble pas la peine.
OriginalL'auteur David W Crook
Trouvé ce ServletContextListener exemple par mkyong. Citant l'article:
Cela me semble être le bon endroit où le code à insérer initiale DB données.
J'ai testé cette approche pour insérer des données initiales pour ma webapp, il fonctionne.
OriginalL'auteur Joseph Victor Zammit
J'ai trouvé intéressant de code dans ce référentiel: https://github.com/resilient-data-systems/fast-stateless-api-authentication
Cela fonctionne assez soignée dans mon projet:
OriginalL'auteur charlie_pl