3

在互联网上,我经常找到关于这个主题的最新但相反的信息......因此我想问一个关于最低要求的问题。

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

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

所以我只想做一个简单的JPA测试。我让我的 Glassfish 在 Arquillian 中运行,但是在执行 JPA 工作时,我的应用程序总是无法处理 Derby DB(告诉我没有表等),但 DDL 文件看起来很正常。我尝试在我的 persistence.xml 中提供模式名称、用户等,但没有任何帮助。有时,一个偶然的帖子告诉我在一个最小的 domain.xml 中为嵌入式 Glassfish 进行更改以匹配我的 persistence.xml 或适应 arquillian.xml。

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

我很确定前一段时间我设法使用 Embedded Glassfish 做到了这一点,但使用 Hibernate 4 作为 JPA 提供程序。我无法再访问该项目,因此无法区分,除非我明确没有添加 domain.xml 等。像(此处的其他问题)这样的帖子确实让我感到困惑。

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

谢谢和欢呼,蒂莫

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

<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>
4

1 回答 1

1

由于您的连接 URL 是:jdbc:derby:memory:test;create=true,因此您告诉 Derby 的是:连接到文件夹“test”中的数据库,相对于 Derby 启动位置的当前工作目录,如果当前工作目录中不存在该数据库“测试”,请从头开始创建它。

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

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

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

然后先创建一次数据库,然后您的应用程序将在指定位置找到数据库并使用它。

于 2013-02-23T16:05:38.170 回答