EclipseLink不会在H2 DB中看到创建的表

问题描述 投票:0回答:1

对于应用程序的测试运行,我使用的是H2数据库1.4.197。该应用程序部署在使用EclipseLink 2.6.4的TomEE 7.1.0上。

我在日志中看到,在启动期间,EclipseLink创建了表,序列等。甚至用值0初始化序列:

[EL精细]:2019-02-13 20:25:37.442 - ServerSession(1981996085) - 连接(1317890500) - 线程(线程[http-nio-8080-exec-4,5,main]) - CREATE TABLE USER(ID BIGINT NOT NULL,FIRSTNAME VARCHAR,LASTNAME VARCHAR,PRIMARY KEY(ID))[EL Fine]:2019-02-13 20:25:37.467 - ServerSession(1981996085) - 连接(1320052060) - Thread(Thread [http-nio-8080-exec-4,5,main]) - CREATE TABLE ADDRESS(ID BIGINT NOT NULL,CITY VARCHAR,HOUSENO VARCHAR,STREET VARCHAR,PRIMARY KEY(ID))[EL Fine]: 2019-02-13 20:25:37.474 - ServerSession(1981996085) - 连接(1328271122) - 线程(线程[http-nio-8080-exec-4,5,main]) - CREATE TABLE SEQUENCE(SEQ_NAME) VARCHAR(50)NOT NULL,SEQ_COUNT NUMERIC(38),PRIMARY KEY(SEQ_NAME))[EL Fine]:2019-02-13 20:25:37.489 - ServerSession(1981996085) - 连接(432174967) - 线程(线程[http-nio-8080-exec-4,5,main]) - SELECT * FROM SEQUENCE WHERE SEQ_NAME ='SEQ_GEN'[EL Fine]:2019-02-13 20:25:37.51 - ServerSession(1981996085) --Connection(1127939384) - 线程(线程[HTTP-NIO-8080-EXEC-4, 5,main]) - INSERT INTO SEQUENCE(SEQ_NAME,SEQ_COUNT)值('SEQ_GEN',0)

我也能够通过H2控制台连接(我在应用程序内手动启动了WebServer)并查看表/序列。

当我通过JPQL进行简单的选择时,一切正常:

Collection<User> getUsers() {
    Query query = entityManager.createQuery("select u from User u");
    return query.getResultList();
}

但是,当我尝试使用persist方法插入新行时:

void saveUser(User user) {
    entityManager.persist(user);
}

然后我得到表不存在的异常:

异常[EclipseLink-4002](Eclipse Persistence Services - 2.6.4.v20160829-44060b6):org.eclipse.persistence.exceptions.DatabaseException内部异常:org.h2.jdbc.JdbcSQLException:Tabela“SEQUENCE”nie istnieje表“SEQUENCE”未找到; SQL语句:UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT +?在哪里SEQ_NAME =? [42102-197]错误代码:42102调用:UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT +?在哪里SEQ_NAME =? bind => [50,SEQ_GEN]查询:DataModifyQuery(name =“SEQUENCE”sql =“UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT +?WHERE SEQ_NAME =?”)

编辑:

用户实体实现:

@Entity
public class User {
    private Long id;
    private String firstName;
    private String lastName;
    @Id
    @GeneratedValue
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    @Column
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    @Column
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}
jpa java-ee eclipselink h2
1个回答
0
投票

可能问题在于您对H2连接的定义。如果您使用带有错误参数的内存版本,H2将自动丢弃您的表格。

假设您将以这种方式进行配置:

jdbc:h2:mem:test

将其更改为

jdbc:h2:mem:test;DB_CLOSE_DELAY=-1

Keep H2 in-memory database between connections

为了将来,请避免使用USER等名称作为表名。它是大多数提供商的保留字。它不会给H2带来任何麻烦,因为它是这个提供者可接受的名称,但它不能与其他数据库兼容。

Keywords / Reserved Words

© www.soinside.com 2019 - 2024. All rights reserved.