在测试环境中使用 Eclipselink 和 h2 生成序列时出现异常

Posted

技术标签:

【中文标题】在测试环境中使用 Eclipselink 和 h2 生成序列时出现异常【英文标题】:Exception when generating sequence using Eclipselink and h2 in test environment 【发布时间】:2012-12-03 12:57:02 【问题描述】:

我正在使用 h2 为使用 Eclipselink、Arquillian 和 Weblogic 12.1.1 的应用程序设置集成测试

这是我的实体:

@Entity
@Table(name = "AFIS_REQUEST")
public class Request implements Serializable 
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "requestSEQ")
    @SequenceGenerator(name = "requestSEQ", sequenceName = "REQUEST_ID_SEQ", allocationSize = 1)
    @Column(name = "ID")
    private Long id;
...

这是我的persistence.xml

<persistence-unit name="myPU" transaction-type="JTA">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <jta-data-source>jdbc/arquillian</jta-data-source>
        <class>com.my.Request</class>
        <exclude-unlisted-classes>true</exclude-unlisted-classes>
        <validation-mode>NONE</validation-mode>
        <properties>
            <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>            
            <property name="eclipselink.logging.level.sql" value="FINEST"/>
            <property name="eclipselink.logging.parameters" value="true"/>
            <property name="eclipselink.target-database" value="org.eclipse.persistence.platform.database.H2Platform"/>
        </properties>
    </persistence-unit>

这是我在 Weblogic 数据源中指定的 JDBC URL 和 Driver 类:

jdbc:h2:file:target/databases/h2/db org.h2.jdbcx.JdbcDataSource

但是当我开始测试时,出现以下异常:

<Dec 3, 2012 3:58:23 PM IRST> <Warning> <EclipseLink> <BEA-2005000> <2012-12-03 15:58:23.217--ServerSession(16406343)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.h2.jdbc.JdbcSQLException: Sequence "REQUEST_ID_SEQ" not found; SQL statement:
CALL NEXT VALUE FOR REQUEST_ID_SEQ [90036-166]
Error Code: 90036
Call: CALL NEXT VALUE FOR REQUEST_ID_SEQ
Query: ValueReadQuery(sql="CALL NEXT VALUE FOR REQUEST_ID_SEQ")> 

因为我希望在开始测试时创建表并在完成测试时删除我已将 drop-and-create-tables 分配给 eclipselink.ddl-generation 属性。但似乎 Table 已生成,但它的序列不是由 Eclipselink 创建的。

h2 是否支持生成序列?还是我缺少任何配置?

编辑: 我检查了生成的DDL,它显示创建序列语句已生成。

CREATE TABLE REQUEST (ID BIGINT NOT NULL, ... , PRIMARY KEY (ID))
CREATE SEQUENCE REQUEST_ID_SEQ START WITH 1

然后我使用 H2 Web 控制台连接到生成的数据库,看到生成了序列,我可以在那里成功执行 CALL NEXT VALUE FOR REQUEST_ID_SEQ

那么为什么 Eclipselink 抱怨它!? Sequence "REQUEST_ID_SEQ" not found;

【问题讨论】:

这里一切正常。如果您可以使用output-mode config property 输出 EclipseLink 生成的 DDL 来验证 EclipseLink 是否确实生成了一个序列,那么您可能会有一些运气。 感谢 Vineet,我根据您的评论更新了问题。 好的,我不确定这是否是原因,但您似乎没有在 persistence.xml 中列出任何实体类,尽管您将 exclude-unlisted-classes 元素定义为 true。如果你有一个我可以处理的可重现的测试用例,我不介意看一下。 我不确定这是否是问题所在,但您可以尝试使用绝对数据库 URL,还是相对于用户主目录,例如 jdbc:h2:file:~/temp/databases/h2/db 我为不必要的警告创建了一个错误报告:bugs.eclipse.org/bugs/show_bug.cgi?id=470284 我想它需要一些投票才能得到修复...... 【参考方案1】:

我遇到了同样的问题,我设法让它工作,只需将此行添加到您的持久性文件中:

<property name="eclipselink.target-database" value="org.eclipse.persistence.platform.database.H2Platform"/>

它必须是&lt;properties&gt; 的第一个属性。

请注意,您仍然会收到警告。

我找到了解决方案here

【讨论】:

知道如何摆脱警告吗?

以上是关于在测试环境中使用 Eclipselink 和 h2 生成序列时出现异常的主要内容,如果未能解决你的问题,请参考以下文章

EclipseLink 和 H2

使用 EclipseLink 的 H2 数据库出现问题(即使没有错误,程序也不会更改数据库)

JPA 从 EclipseLink 到哪个提供商?

使用 EclipseLink 处理 Spring 事务

WSO2 H2 数据库

H2 的休眠多租户问题:错误的架构