在JavaEE和JavaSE环境之间重用persistence.xml

时间:2014-01-03 06:39:29

标签: java jpa junit openjpa persistence.xml

我主要在WebSphere 7.0下进行JPA开发,它使用OpenJPA作为其JPA提供程序。

我有以下persistence.xml文件:

<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="PU">
        <jta-data-source>jdbc/test</jta-data-source>
        ...
        ... Entities
        ...
    </persistence-unit>
</persistence>

而且,在WebSphere下运行时,事情按预期工作:OpenJPA为jdbc/test执行JNDI查找,JPA在那里发挥作用。

现在,我想为我的代码编写JUnit测试人员。 JUnit测试人员在JavaSE下运行,但我无法使其工作。我意识到JUnit测试人员必须以某种方式为OpenJPA提供数据库的连接信息(因为jdbc/test在JavaSE中没有任何意义),但是根据我的尝试我会得到不同的错误。

我尝试了什么:

备选方案1(有效,但......)

注释掉jta-data-source,并在Java代码中提供了MapPersistence.createEntityManagerFactory。该映射包含键openjpa.ConnectionFactory,其值为预构造的OracleDataSource实例,其中包含所有连接属性。

有效:JPA可以连接到数据库。但是,我不喜欢这个选项,因为它再次暗示我必须修改我的persistence.xml文件,具体取决于我是在JavaEE还是JavaSE上运行。

备选方案2

保持jta-data-source,并尝试将Map传递给Persistence.createEntityManagerFactory,其中包含我认为有用的各种属性。无论我尝试什么,我都会收到以下错误:

Caused by: <openjpa-2.0.2-SNAPSHOT-r422266:1389965 fatal user error>
org.apache.openjpa.util.InvalidStateException: Could not perform automatic lookup of EJB
container's javax.transaction.TransactionManager implementation. Please ensure that you
are running the application from within an EJB 1.1 compliant EJB container, and then set
the org.apache.openjpa.ManagedRuntime property to the appropriate value to obtain the
TransactionManager.

...这意味着OpenJPA仍在尝试执行JNDI查找,即使我传递了一个带有键的地图,指示它不这样做。

还有其他人遇到过这个吗?通过传递OpenJPA属性来覆盖JNDI查找,是否有可能在JavaSE环境中使用JNDI-“启用”persistence.xml

(顺便说一句:我所知道的是,在JavaSE下,transaction-type的{​​{1}}属性默认为persistence-unit,因此不能成为我问题的根源)

0 个答案:

没有答案