À 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!

InformationsquelleAutor Old Pro | 2012-03-28