为了测试,我有两个persistence.xml
个文件:
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.
答案 0 :(得分:11)
查看针对您要执行的操作的alternate descriptors功能。
尝试此设置:
src/main/resources/META-INF/persistence.xml
src/main/resources/META-INF/test.persistence.xml
然后,您可以通过将test.persistence.xml
System或InitialContext属性设置为openejb.altdd.prefix
test
文件
另一种可能的解决方案可能是override the persistence unit properties in the test。通过这种方法,您可以避免需要第二个persistence.xml
,这可能很好,因为维持两个可能会很痛苦。
您可以使用Maven方法,但请注意,根据规范,持久性提供程序只会在找到@Entity
的确切jar或目录中查找(aka扫描)persistence.xml
个bean。所以要敏锐地意识到,在Maven中,这是两个不同的位置:
target/classes
target/test-classes
编辑有关覆盖功能的更多详细信息
您可以通过系统属性或初始上下文属性(包括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
答案 1 :(得分:1)
我认为您可以在pom.xml中创建两个配置文件:
<properties>
<environment>dev</environment>
</properties>
<profiles>
<profile>
<id>prod</id>
<properties>
<environment>test</environment>
</properties>
</profile>
</profiles>
之后,在您的src文件夹中,创建两个名为dev / resoruces和test / resources的文件夹,并在那里复制您的不同资源。之后,添加如下内容:
<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 。
答案 2 :(得分:0)
我一直在测试这些和其他类似的解决方案而不涉及pom.xml ...在我看来,解决这个问题的最好方法是有两个application-context.xml(一个只用于测试类)并在测试的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>
此解决方案运行。 :)
答案 3 :(得分:-2)
更好地添加两个文件 - 通常,在构建中进行测试/生产或调试/配置文件/生产区分只会带来麻烦。 最好尝试使用不同的perasistence单位名称进行生产(比如abc-production)和测试(abc-tests)。