对于应用程序的测试运行,我使用的是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;
}
}
可能问题在于您对H2连接的定义。如果您使用带有错误参数的内存版本,H2将自动丢弃您的表格。
假设您将以这种方式进行配置:
jdbc:h2:mem:test
将其更改为
jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
Keep H2 in-memory database between connections
为了将来,请避免使用USER等名称作为表名。它是大多数提供商的保留字。它不会给H2带来任何麻烦,因为它是这个提供者可接受的名称,但它不能与其他数据库兼容。