对于应用程序的测试运行,我使用的是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;
}
}
答案 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造成任何麻烦,因为它是此提供程序可接受的名称,但它不能与其他数据库兼容。