【发布时间】:2019-07-07 18:01:54
【问题描述】:
对于应用程序的测试运行,我使用的是 H2 数据库 1.4.197。该应用程序部署在使用 EclipseLink 2.6.4 的 TomEE 7.1.0 上。
我在日志中看到 EclipseLink 在启动期间创建了表、序列等。甚至用值 0 初始化序列:
【EL精】:2019-02-13 20:25:37.442--ServerSession(1981996085)--Connection(1317890500)--Thread(Thread[http-nio-8080-exec-4,5,main])--CREATE 表用户(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])--CREATE 表地址(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])--CREATE 表序列 (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)--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 语句:更新序列 SET SEQ_COUNT = SEQ_COUNT + ?哪里 SEQ_NAME = ? [42102-197] 错误 代码:42102 调用:更新序列集 SEQ_COUNT = SEQ_COUNT + ?在哪里 SEQ_NAME = ?绑定 => [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;
}
}
【问题讨论】:
-
显示您的
User实体。它抱怨 Tabela "SEQUENCE" 但不抱怨缺少表User?并尝试将表名 SEQUENCE 更改为保留字可能会导致问题。 -
我用实体实现更新了我的问题
-
尝试使用 TableGenerator 将表名指定为“SEQUENCE”以外的名称。即@GeneratedValue(generator="TabGen") @TableGenerator(name="TabGen", table="ID_TABLE")
-
还展示了如何设置数据源连接池。 EclipseLink 将为序列表更新使用不同的连接,从而避免在使用活动连接/事务时出现可见性和回滚问题。此池可能具有不同的数据库视图。
标签: jpa jakarta-ee eclipselink h2