J'ai un projet JPA et j'aimerais insérer certaines données initiales uniquement sur le développement, je peux donc vérifier si tout fonctionne facilement facile. P>
Mes recherches me conduisent à trouver uniquement une solution avec script SQL direct, mais cela n'a pas raison. Si j'utilise un cadre sur les détails de la base de données abstraite, pourquoi créerais-je un script pour une base de données spécifique? P>
dans le rubis sur rails monde, nous avons la commande "Rake dB: graine" que simple exécute un fichier nommé graine.rb qui a la fonction d'ajouter les données initiales de la base de données appelant la couche d'abstraction. Y a-t-il quelque chose comme ça sur Java? P>
La solution idéale que je peux penser serait d'exécuter un objectif maven qui exécuterait une classe Java, existe-t-il un moyen facile ou un plugin maven pour le faire? P>
5 Réponses :
Créez simplement une classe et une méthode qui crée les objets et persiste les données. Lorsque vous allumez votre application, exécutez la méthode que vous avez créée dans un servlet init.Vous pouvez charger votre servlet avec la configuration Web.xml suivante.
<servlet> <servlet-name>MyServlet1</servlet-name> <servlet-class>com.example.MyServlet1</servlet-class> <load-on-startup>1</load-on-startup> </servlet>
Sinon, vous pouvez le faire à partir d'un haricot de ressort et peut donc être fait sans un récipient de servlet pour les tests d'intégration.
Vous pouvez modéliser votre projet avec Maven et écrire un test simple pour initialiser les données de la graine. La seule chose que vous devrez faire est de gérer "test MVN". P>
Je ressens votre douleur, je me suis allé dans un projet Java pour toutes les rails de PARKS.
Cela étant dit, il n'y a aucune raison d'utiliser SQL droit. Cette approche demande simplement des problèmes. Lorsque votre schéma de base de données change pendant le développement, toutes les pauses SQL fragiles SQL. Il est plus facile de gérer les données s'il est mappé sur les modèles JPA, qui résument l'interaction SQL avec la base de données. P>
Ce que vous devriez faire est d'utiliser vos modèles JPA pour semer vos données. Créez un composant pouvant exécuter la création de modèles dont vous avez besoin et persistez. Dans mon projet actuel, nous utilisons Snake Yaml pour sérialiser nos modèles comme YAML. Graver notre base de données, nous désérialisalisons les modèles YAML aux modèles JPA et persistez. P>
Si les modèles changent (changements de variable, supprimez les colonnes, etc.), vous devez vous assurer que les données Serialize seront toujours en mesure de désérialiser correctement dans les modèles JPA. L'utilisation du format humain lisible de YAML facilite la mise à jour des modèles sérialisés. P>
Pour exécuter vos données de graine, Bootstrap votre système mais vous pouvez. Comme @geoorgemcDowd a dit, vous pouvez utiliser un servlet. Personnellement, je préfère créer un outil de ligne de commande en créant un Uberjar avec personnellement, j'aime maven comme des métadonnées de projet, mais je trouve difficile comme outil de construction. Les éléments suivants peuvent être utilisés pour exécuter une classe Java: p> classe.main code>. Ensuite, il vous suffit de créer un script pour configurer votre parcours de classe et d'appeler la classe
code> pour exécuter la graine. P>
Pourquoi avez-vous besoin de sérialiser / désérialiser votre modèle à YAML?
Ne doit pas nécessairement être YAML, aucun moyen de sérialiser les modèles à un fichier. Ensuite, vous pouvez utiliser les fichiers comme données de semences pour la base de données. Yaml vient d'être facile à travailler pour la lecture et l'édition.
Semblable à l'idée de Amuniz: consultez dbunit . C'est une extension junit pour éliminer les données de test dans une DB. Il utilise un simple format XML de schéma moins de schéma pour cela. Et l'exécuter à travers une classe d'essai utilisant "Test MVN" est une chose simple à faire. P>
J'ai fait cela et pendant que cela fonctionne, le XML résultant est tout aussi fragile que le SQL L'OP essayait d'éviter en premier lieu.
Vous pouvez réduire une partie de la franchise et de la reprise manuelle en incluant un outil de migration de la DB, comme Liquibase, dans votre production, ainsi que la gestion des données de test.
Je suggérerais Liquibase http://www.liquibase.org/ pour cela. Il possède de nombreux plugin et vous permet de définir la logique de restauration pour chaque jeu de modifications (et de détecter la restauration dans certains cas). P>
Dans ce cas, il est également important de penser aux serveurs de production et à la manière dont les données de semences seront déplacées à la production. p>