Arquillian:我是否需要使用domain.xml和arquillian.xml进行Derby DB的最小Glassfish嵌入式测试?

时间:2013-02-23 02:14:19

标签: jpa junit glassfish derby

在互联网上我经常发现最近但有关此主题的相反信息......因此我想问一个关于最低要求的问题。

我的目标是对简单的EJB 3.1应用程序进行非常简单的集成测试:

  • 使用EclipseLink的简单JPA 2.0功能
  • 使用JUnit进行测试的Arquillian
  • 的Maven
  • Derby DB(在内存或./target文件中),JTA持久化上下文。
  • Arquillian的嵌入式Glassfish

所以我只想做一个简单的JPA测试。我让我的Glassfish运行在Arquillian中,但是在执行我的JPA时,我的应用程序始终无法处理Derby DB(告诉我没有表等),但DDL文件看起来很清晰。 我在persistence.xml中提供了模式名称,用户等,但没有任何帮助。有时会发布一些帖子告诉我在嵌入式Glassfish的最小domain.xml中进行更改以匹配我的persistence.xml或调整arquillian.xml。

我的问题是:对于这种最小的方法 - 我真的需要src / test / glassfish / domains / domain1 / domain.xml或arquillian.xml吗?

我很确定前段时间我设法使用Embedded Glassfish,但使用Hibernate 4作为JPA提供程序。我无法访问该项目,因此无法区分,除了我定义没有添加domain.xml等。 像(other question here)这样的帖子确实让我很困惑。

重要的是,我没有使用托管服务器,而是使用嵌入式服务器。

谢谢,欢呼, 蒂莫

以下是我的一个版本,请参阅我的以下评论。

<persistence-unit name="localiser-core" transaction-type="JTA">
    <jta-data-source>jdbc/__default</jta-data-source>
    <properties>
        <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver" />
        <property name="javax.persistence.jdbc.url"
                  value="jdbc:derby:memory:test;create=true" />
        <property name="javax.persistence.jdbc.user" value="" />
        <property name="javax.persistence.jdbc.password" value="" />

        <property name="eclipselink.target-database" value="Derby"/>
        <property name="eclipselink.ddl-generation.output-mode"
                  value="database" />

        <property name="eclipselink.ddl-generation" value="create-tables" />
        <property name="eclipselink.application-location" value="target" />
        <property name="eclipselink.create-ddl-jdbc-file-name" value="create.sql"/>
        <property name="eclipselink.drop-ddl-jdbc-file-name" value="drop.sql"/> 
        <property name="eclipselink.debug" value="ALL"/>
        <property name="eclipselink.weaving" value="static"/>
        <property name="eclipselink.logging.level" value="FINEST"/>
        <property name="eclipselink.logging.level.sql" value="FINEST"/>
        <property name="eclipselink.logging.level.cache" value="FINEST"/>

    </properties>

</persistence-unit>

1 个答案:

答案 0 :(得分:1)

由于你的连接URL是:jdbc:derby:memory:test; create = true,你告诉Derby的是:连接到'test'文件夹中的数据库,相对于Derby启动的当前工作目录,如果当前工作目录中没有该数据库'test',请从头开始创建。

因此,一种可能性是您的应用程序每次都有一个不同的当前工作目录,或者每次运行应用程序时应用程序中的其他内容都清除了您当前的工作目录。

因此,Derby在该位置找不到以前的数据库,因此它创建了一个全新的数据库。

解决此问题的一种方法是使用连接URL为数据库指定更明确的位置,例如:jdbc:derby:memory:/ users / timo / testdb

然后在前面创建数据库,然后在应用程序将在指定位置找到数据库并使用它。

相关问题