À l'aide d'une persistence.xml les fichiers de production et de test avec le Printemps 3.1
OK, désolé, j'ai cherché des réponses à cela pendant des heures, mais il m'a fallu entrer dans l'ensemble de la question de StackOverflow à bulle le lien que je cherchais. Vous pouvez lire beaucoup d'informations pertinentes ici.
J'ai un projet pour le Printemps créé avec Spring Roo à utiliser Hibernate et MySQL. Toutefois, pour les tests, je veux utiliser HSQLDB dans la mémoire car le Roo tests d'intégration de suppression des données avec les Id (clé primaire) de 0 à 10 (plutôt que de supprimer les données à l'aide de la base de données attribué id pour les données qu'ils ont déjà créé), ce qui signifie qu'il supprime les données qui sont déjà dans la base de données, ce qui dans mon cas, provoque une violation de contrainte avant qu'il arrive autour de l'annulation de la transaction.
C'est un peu plus difficile parce que je suis passer toute la base de données des fournisseurs qui signifie que les différents Hibernate dialectes ainsi que les différentes DDL paramètres (valider en production, créez-la baisse de test). Mais il ne fonctionne pas comme je m'attends et je suis perplexe quant à pourquoi.
Si vous savez pourquoi ça ne fonctionne pas, merci de le dire, même si vous n'avez pas de solution.
Ce qui est un Roo projet, je suis à l'aide de Maven bien sûr. Donc, la première chose que j'ai essayé était de disposer d'un test spécifique src/test/resources/META-INF/persistence.xml
fichier et de même un test spécifique src/test/resources/META-INF/spring/database.properties
fichier. Cela ne fonctionne pas, comme quand j'ai couru mvn test
tout cassé, avec le message
Conflicting persistence unit definitions for name 'persistenceUnit'
Pourquoi mvn test
encore la cueillette jusqu'à la non-ressources de test?
Alors j'ai renommé src/test/resources/META-INF/spring
à spring-test
et copié applicationContext.xml
en elle. J'ai changé le contexte de configuration dans les classes de test pour
@ContextConfiguration(locations = "classpath:/META-INF/spring-test/applicationContext*.xml")
Compléter (ou alors j'ai pensé) la séparation, j'ai fait quelques modifications pour spring-test/applicationContext.xml
:
Modifié le chemin d'accès pour les fichiers de propriétés:
<context:property-placeholder location="classpath*:META-INF/spring/*.properties"/>
à
<context:property-placeholder location="classpath*:META-INF/spring-test/*.properties"/>
Changé le nom de l'unité de persistance:
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
<property name="persistenceUnitName" value="persistenceUnit"/>
<property name="dataSource" ref="dataSource"/>
</bean>
à
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
<property name="persistenceUnitName" value="testPersistenceUnit"/>
<property name="dataSource" ref="dataSource"/>
</bean>
Et j'ai fait le changement correspondant dans l'unité de persistance nom de src/test/resources/META-INF/persistence.xml
Bon, OK, maintenant il n'y a pas de conflit, mais de toute façon, Hibernate a perdu les mappages d'entité (par exemple, pour la Product
entité) et j'obtiens:
org.springframework.dao.InvalidDataAccessApiUsageException:
org.hibernate.hql.ast.QuerySyntaxException: Product is not mapped [SELECT o FROM Product o];
Pourquoi a Spring/Hibernate perdu l'entité mappages dans cette configuration?
Alors, la prochaine chose que j'ai essayé était de fusionner les deux persistence.xml
fichiers de sorte qu'un seul fichier sous src/main/resources/META-INF
comprend à la fois les unités de persistance.
Qui Fonctionne!!??
Je pense que c'est laid, parce que maintenant j'ai tester la configuration de mon code de production, mais c'est ce que je suis par avec.
Ce qui est une meilleure façon?
C'est ma compréhension que les propriétés ne sont pas disponibles à l'intérieur de persistence.xml la façon dont ils sont à l'intérieur du Printemps des fichiers XML. Donc je ne pense pas que je peux faire ce que je veux avec juste un test spécifique fichier de propriétés.
Idéalement, j'aimerais exécuter des tests à l'aide de la configuration sous src/main/resources sauf pour ce qui est remplacée dans src/test/resources. Est-il un moyen pour accomplir cette?
Merci pour toutes les informations que peut fournir!
Vous devez vous connecter pour publier un commentaire.
Dans mon travail, j'ai utilisé pour configurer le persistence.xml sans les informations de connexion de base de données. La connexion de base de données est définie par le Printemps contexte de configuration. Dans le cadre du Printemps, il y a plusieurs façon de modifier les propriétés d'un objet:
Code suivant est un extrait de mon contexte de la demande:
Voici la configuration pour le test:
Quand je suis en cours d'exécution de test, j'ai installé les propriétés du système dans Maven infaillible pour configurer la base de données différente. Comme l'exemple suivant: