EE6/CDI/JPA プロジェクトでは、src/test/resources/META-INF/persistence.xml
追加の構成を行わなくても、テストは問題なく取得されます。
Spring で JPA を使用する場合、テストに使用されるアプリケーション コンテキストで次のように動作します。
<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>
ここでは、/src/test/resources/META-INF/persistence.xml
(copyed into target/test-classes
) が (copyed into ) よりも優先/src/main/resources/META-INF/persistence.xml
されtarget/classes
ます。
残念ながら、persistence.xml
ファイルの場所によって、いわゆる「永続化ユニットのルート@Entity
」も決定されます。これにより、注釈をスキャンするクラスが決定されます。したがって、 を使用すると、 のクラスではなく、の/src/test/resources/META-INF/persistence.xml
クラスがスキャンされます (テストする必要があるクラスが存在する場所)。target/test-classes
target/classes
したがって、テストでは、 を避けるために、 に<class>
エントリを明示的に追加する必要があります。のような別のファイル名を使用し、そのファイルを通常のファイルとまったく同じフォルダーに配置することで、エントリの必要性を回避できます。テスト フォルダーの Spring コンテキストは を参照するだけで、Spring は でそれを見つけます。persistence.xml
java.lang.IllegalArgumentException: Not an entity: class ...
<class>
persistence-TEST.xml
persistence.xml
<property name="persistenceXmlLocation" value="META-INF/persistence-TEST.xml" />
src/main
persistence.xml
別の方法として、実際のアプリケーションとテストで同じものを保持し、 src/main
. ドライバー、方言、オプションの資格情報などのほとんどの構成は、代わりに Spring コンテキストで行うことができます。また、次のような設定をコンテキストで渡すhibernate.hbm2ddl.auto
ことができます:
<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>