Dans un projet EE6/CDI/JPA, un test src/test/resources/META-INF/persistence.xml
est récupéré sans autre configuration.
Lorsque vous utilisez JPA dans Spring, ce qui suit fonctionne dans le contexte de l'application utilisée pour les tests :
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<!--
JPA requires META-INF/persistence.xml, but somehow prefers the one
in classes/META-INF over the one in test-classes/META-INF. Spring
to the rescue, as it allows for setting things differently, like by
referring to "classpath:persistence-TEST.xml". Or, simply referring
to "META-INF/persistence.xml" makes JPA use the test version too:
-->
<property name="persistenceXmlLocation" value="META-INF/persistence.xml" />
<!-- As defined in /src/test/resources/META-INF/persistence.xml -->
<property name="persistenceUnitName" value="myTestPersistenceUnit" />
<property name="jpaVendorAdapter">
<bean
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
</bean>
</property>
</bean>
Ici, /src/test/resources/META-INF/persistence.xml
(copié dans target/test-classes
) serait préféré à /src/main/resources/META-INF/persistence.xml
(copié dans target/classes
).
Malheureusement, l'emplacement de la persistence.xml
détermine également les " Racine de l'unité de persistance "qui détermine ensuite quelles classes sont analysées pour @Entity
annotations. Ainsi, en utilisant /src/test/resources/META-INF/persistence.xml
balayerait les classes dans target/test-classes
et non les classes de target/classes
(où se trouvent les classes qui doivent être testées).
Par conséquent, pour les tests, il faut ajouter explicitement l'élément suivant <class>
entrées à persistence.xml
pour éviter java.lang.IllegalArgumentException: Not an entity: class ...
. La nécessité de <class>
peuvent être évitées en utilisant un nom de fichier différent, comme par exemple persistence-TEST.xml
et placez ce fichier dans le même dossier que celui de la version normale de l'application. persistence.xml
fichier. Le contexte Spring de votre dossier de test peut alors simplement faire référence à <property name="persistenceXmlLocation" value="META-INF/persistence-TEST.xml" />
et Spring le trouvera pour vous dans src/main
.
En guise d'alternative, on pourrait garder persistence.xml
la même pour l'application réelle et les tests, et n'en définir qu'une seule en src/main
. La plupart des configurations telles que les pilotes, le dialecte et les informations d'identification facultatives peuvent être effectuées dans le contexte Spring. De même, les paramètres tels que hibernate.hbm2ddl.auto
peut être transmis dans le contexte :
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!-- For example: com.mysql.jdbc.Driver or org.h2.Driver -->
<property name="driverClassName" value="#{myConfig['db.driver']}" />
<!-- For example: jdbc:mysql://localhost:3306/myDbName or
jdbc:h2:mem:test;DB_CLOSE_DELAY=-1 -->
<property name="url" value="#{myConfig['db.url']}" />
<!-- Ignored for H2 -->
<property name="username" value="#{myConfig['db.username']}" />
<property name="password" value="#{myConfig['db.password']}" />
</bean>
<bean id="jpaAdaptor"
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<!-- For example: org.hibernate.dialect.MySQL5Dialect or
org.hibernate.dialect.H2Dialect -->
<property name="databasePlatform" value="#{myConfig['db.dialect']}" />
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter" ref="jpaAdapter" />
<property name="jpaProperties">
<props>
<!-- For example: validate, update, create or create-drop -->
<prop key="hibernate.hbm2ddl.auto">#{myConfig['db.ddl']}</prop>
<prop key="hibernate.show_sql">#{myConfig['db.showSql']}</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
</bean>