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

时间:2019-02-13 19:34:47

标签: jpa java-ee eclipselink h2

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

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

  

[EL Fine]:2019-02-13   20:25:37.442--ServerSession(1981996085)-Connection(1317890500)-Thread(Thread [http-nio-8080-exec-4,5,main])-创建   TABLE USER(ID BIGINT NOT NULL,FIRSTNAME VARCHAR,LASTNAME VARCHAR,   PRIMARY KEY(ID))[EL Fine]:2019-02-13   20:25:37.467--ServerSession(1981996085)-Connection(1320052060)-Thread(Thread [http-nio-8080-exec-4,5,main])-创建   表格地址(ID BIGINT NOT NULL,CITY VARCHAR,HOUSENO VARCHAR,   STREET VARCHAR,PRIMARY KEY(ID))[EL Fine]:2019-02-13   20:25:37.474--ServerSession(1981996085)-Connection(1328271122)-Thread(Thread [http-nio-8080-exec-4,5,main])-创建   表序列(SEQ_NAME VARCHAR(50)NOT NULL,SEQ_COUNT NUMERIC(38),   主键(SEQ_NAME)[EL Fine]:2019-02-13   20:25:37.489--ServerSession(1981996085)-Connection(432174967)-Thread(Thread [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)-Thread(Thread [http-nio-8080-exec- 4,5,main])-插入   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持久性服务-   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调用:更新序列设置SEQ_COUNT = SEQ_COUNT +?哪里   SEQ_NAME =吗? bind => [50,SEQ_GEN]查询:   DataModifyQuery(name =“ SEQUENCE” sql =“ UPDATE SEQUENCE SET SEQ_COUNT =   SEQ_COUNT +吗? 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;
    }
}

1 个答案:

答案 0 :(得分: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