16

persistence.xmlテストのために、次の2 つのファイルがあります。

  • src/main/resources/META-INF/persistence.xml
  • src/test/resources/META-INF/persistence.xml

テスト中に最初のファイルを無視するようMavenに指示するには? OpenEJB が次のように述べているため、無視されなくなりました。

ERROR - FAIL ... Finder: @PersistenceContext unitName has multiple matches: 
unitName "abc" has 2 possible matches.
4

4 に答える 4

11

あなたがやろうとしていることを目的とした代替記述子機能をチェックしてください。

このセットアップを試してください:

  • src/main/resources/META-INF/persistence.xml
  • src/main/resources/META-INF/test.persistence.xml

次にtest.persistence.xmlopenejb.altdd.prefixSystem または InitialContext プロパティをtest

別の可能な解決策は、 test で持続性ユニットのプロパティをオーバーライドすることです。persistence.xmlこのアプローチを使用すると、 2 つを維持するのが面倒な場合があるため、1 秒の必要性を回避できます。

Maven アプローチを使用できますが、仕様ごとに、永続化プロバイダーは Beanが見つかっ@Entityた正確な jar またはディレクトリ内の Beanのみを検索 (スキャン) することに注意してください。persistence.xmlそのため、Maven ではこれらが 2 つの異なる場所であることに注意してください。

  • target/classes
  • target/test-classes

EDITオーバーライド機能の詳細

システム プロパティまたは初期コンテキスト プロパティ (これには jndi.properties ファイルが含まれます) のいずれかを使用して、テスト セットアップの任意のプロパティをオーバーライドできます。形式は次のとおりです。

<unit-name>.<property>=<value>

たとえば、次のようにしますpersistence.xml

<persistence>
  <persistence-unit name="movie-unit">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>movieDatabase</jta-data-source>
    <non-jta-data-source>movieDatabaseUnmanaged</non-jta-data-source>
    <properties>
      <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
      <property name="hibernate.max_fetch_depth" value="3"/>
    </properties>
  </persistence-unit>
</persistence>

テスト ケースで持続性ユニットのプロパティをオーバーライドして追加できます。現在、それらを削除するための機能はありません (必要な場合はお知らせください。これまでのところ実際にはありません)。

Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY,"org.apache.openejb.client.LocalInitialContextFactory");

p.put("movie-unit.hibernate.hbm2ddl.auto", "update");
p.put("movie-unit.hibernate.dialect", "org.hibernate.dialect.HSQLDialect");

context = new InitialContext(p);

または代わりにjndi.propertiesファイルを介して

java.naming.factory.initial=org.apache.openejb.client.LocalInitialContextFactory
movie-unit.hibernate.hbm2ddl.auto = update
movie-unit.hibernate.dialect = org.hibernate.dialect.HSQLDialect
于 2010-10-11T17:25:06.840 に答える
1

pom.xml で 2 つのプロファイルを作成できると思います。

<properties>
  <environment>dev</environment>
</properties>
<profiles>
  <profile>
    <id>prod</id>
    <properties>
      <environment>test</environment>
    </properties>
  </profile>
</profiles>

その後、src フォルダーに dev/resoruces と test/resources という名前の 2 つのフォルダーを作成し、そこに異なるリソースをコピーします。その後、次のようなものを追加します。

<resources>
  <resource>
    <directory>${basedir}/src/main/resources</directory>
    <filtering>false</filtering>
  </resource>
  <resource>
    <directory>${basedir}/src/main/${environment}/resources</directory>
    <filtering>true</filtering>
  </resource>
</resources>

${basedir} はコマンド ライン パラメータに依存し、test または dev のいずれかになります。次のように maven コマンドを実行します: mvn clean package -P test

于 2010-10-05T14:24:58.267 に答える
0

私は pom.xml を使用せずにこれらおよび他の同様のソリューションをテストしてきました... 私の意見では、この問題を解決する最善の方法は、2 つの application-context.xml (1 つはテスト クラスでのみ使用) を用意することです。テストの application-context.xml にカスタム持続性ユニット マネージャー Bean を追加します。この例のように:

<bean id="pum" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
  <property name="persistenceXmlLocation">
     <value>classpath*:META-INF/test.persistence.xml</value>
  </property>
  <property name="defaultDataSource" ref="dataSource"/>
</bean>

このソリューションは実行されます。:)

于 2014-04-16T10:46:09.073 に答える
-2

両方のファイルを追加することをお勧めします。一般に、ビルドでテスト/運用またはデバッグ/プロファイル/運用を区別すると、問題が発生するだけです。本番用 (abc-production など) とテスト用 (abc-tests) で異なる永続ユニット名を使用することをお勧めします。

于 2010-10-12T11:16:12.090 に答える