【问题标题】:EclipseLink does not see created tables in H2 DBEclipseLink 在 H2 DB 中看不到创建的表
【发布时间】: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


【解决方案1】:

问题可能出在您对 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

【讨论】:

  • 我在tomee.xml中的连接定义为:jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false
  • 我在 Wildfly(以及 Hibernate 作为它们的默认 JPA 实现)上对其进行了测试,一切正常。所以问题在于 TomEE、EclipseLink 和 H2
  • 我将 DB 更改为 PostgreSQL,在 TomEE 中也一切正常。所以 EclipseLink 和 H2 的组合会导致问题
猜你喜欢
  • 2014-07-29
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-12
  • 1970-01-01
相关资源
最近更新 更多