使用 JPA 在 H2 数据库中插入行时,org.h2.table.Column.updateSequenceIfRequired 会导致 java.lang.NumberFormatException

发布于 2025-01-15 20:21:11 字数 2374 浏览 2 评论 0原文

预先感谢您投入时间来提供帮助。

上下文:

  • 我正在使用 Spring-boot 和 H2 数据库。

我试图将一行(第一行)插入表中,当尝试将标识符列 (id) 的字符串值转换为 Long 时,会导致 NumberFormatException。我确信这种行为有一个合乎逻辑的解释,但我不明白为什么尝试将具有 String 类型(id)的列转换为 long。我认为该 id 试图增加,但我不明白为什么。根据 https://docs.jboss。 org/hibernate/orm/5.0/mappingGuide/en-US/html/ch06.html,标识符的有效类型包括字符串。我想知道是什么导致了这个问题。

这是我的表架构:

CREATE TABLE events (
  specversion VARCHAR(5),
  type        VARCHAR(50),
  source      VARCHAR(50),
  subject     VARCHAR(50),
  id          VARCHAR(10) IDENTITY PRIMARY KEY,
  time        TIMESTAMP,
  datacontenttype VARCHAR(50),
  data        VARCHAR(1048576)
);
CREATE INDEX events_id ON events (id);

这是我的实体类:

@Getter
@Setter
@Entity
@Table(name = "events")
public class Event {

    @Column(name = "specversion")
    private String specversion;

    @Column(name = "type")
    private String type;

    @Column(name = "source")
    private String source;

    @Column(name = "subject")
    private String subject;

    @Id
    @Column(name = "id")
    private String id;

    @Column(name = "time")
    private OffsetDateTime time;

    @Column(name = "datacontenttype")
    private String datacontenttype;

    @Column(name = "data")
    private String data;

}

这是我的存储库接口:

import org.springframework.data.repository.Repository;

public interface EventRepository extends Repository<Event, String> {

    void save(Event event);

}

创建事件实例时,我将 id 设置为“Id1”:

event.setId("Id1");

这是堆栈跟踪:

java.lang.NumberFormatException:用于输入字符串:“Id1” 在 java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68) ~[na:na] 在 java.base/java.lang.Long.parseLong(Long.java:707) ~[na:na] 在 java.base/java.lang.Long.parseLong(Long.java:832) ~[na:na] 在 org.h2.value.Value.convertToLong(Value.java:1011) ~[h2-1.4.200.jar:1.4.200] 在 org.h2.value.Value.convertTo(Value.java:808) ~[h2-1.4.200.jar:1.4.200] 在 org.h2.value.Value.convertTo(Value.java:737) ~[h2-1.4.200.jar:1.4.200] 在 org.h2.value.Value.getLong(Value.java:627) ~[h2-1.4.200.jar:1.4.200] **在 org.h2.table.Column.updateSequenceIfRequired(Column.java:416)

Thank you in advance for investing time in trying to help.

Context:

  • I am using Spring-boot with H2 database.

I am trying to insert a row, the very first row, into a table and that results in a NumberFormatException when the String value of an Identifier column (id) is attempted to be converted into a Long. I am sure there is a logical explanation of this behavior, but I don't understand why a column with a String type (id) is attempted to be converted into a long. I take that that id is attempted to be incremented, but I do not understand why. According to https://docs.jboss.org/hibernate/orm/5.0/mappingGuide/en-US/html/ch06.html, a valid type for Identifiers includes String. I would like to know what is causing this problem.

This is my table schema:

CREATE TABLE events (
  specversion VARCHAR(5),
  type        VARCHAR(50),
  source      VARCHAR(50),
  subject     VARCHAR(50),
  id          VARCHAR(10) IDENTITY PRIMARY KEY,
  time        TIMESTAMP,
  datacontenttype VARCHAR(50),
  data        VARCHAR(1048576)
);
CREATE INDEX events_id ON events (id);

This is my entity class:

@Getter
@Setter
@Entity
@Table(name = "events")
public class Event {

    @Column(name = "specversion")
    private String specversion;

    @Column(name = "type")
    private String type;

    @Column(name = "source")
    private String source;

    @Column(name = "subject")
    private String subject;

    @Id
    @Column(name = "id")
    private String id;

    @Column(name = "time")
    private OffsetDateTime time;

    @Column(name = "datacontenttype")
    private String datacontenttype;

    @Column(name = "data")
    private String data;

}

This is my Repository interface:

import org.springframework.data.repository.Repository;

public interface EventRepository extends Repository<Event, String> {

    void save(Event event);

}

When creating an instance of Event I am setting id to "Id1":

event.setId("Id1");

This is the stack trace:

java.lang.NumberFormatException: For input string: "Id1"
at
java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68) ~[na:na]
at java.base/java.lang.Long.parseLong(Long.java:707) ~[na:na]
at java.base/java.lang.Long.parseLong(Long.java:832) ~[na:na]
at org.h2.value.Value.convertToLong(Value.java:1011) ~[h2-1.4.200.jar:1.4.200]
at org.h2.value.Value.convertTo(Value.java:808) ~[h2-1.4.200.jar:1.4.200]
at org.h2.value.Value.convertTo(Value.java:737) ~[h2-1.4.200.jar:1.4.200]
at org.h2.value.Value.getLong(Value.java:627) ~[h2-1.4.200.jar:1.4.200]
**at org.h2.table.Column.updateSequenceIfRequired(Column.java:416)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

明明#如月 2025-01-22 20:21:11

IDENTITY关键字自动生成一个递增的64位长整数作为表的id。

您不必传递 id 属性,它将自动生成。
或者从脚本中删除 IDENTITY 关键字。

CREATE TABLE events (
  specversion VARCHAR(5),
  type        VARCHAR(50),
  source      VARCHAR(50),
  subject     VARCHAR(50),
  id          VARCHAR(10) PRIMARY KEY,
  time        TIMESTAMP,
  datacontenttype VARCHAR(50),
  data        VARCHAR(1048576)
);
CREATE INDEX events_id ON events (id);

The IDENTITY keyword automatically generating an incrementing 64-bit long integer as id of table.

You dont have to pass id attribute, it will be auto generated.
Or remove IDENTITY keywork from script.

CREATE TABLE events (
  specversion VARCHAR(5),
  type        VARCHAR(50),
  source      VARCHAR(50),
  subject     VARCHAR(50),
  id          VARCHAR(10) PRIMARY KEY,
  time        TIMESTAMP,
  datacontenttype VARCHAR(50),
  data        VARCHAR(1048576)
);
CREATE INDEX events_id ON events (id);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文