使用 JPA 在 H2 数据库中插入行时,org.h2.table.Column.updateSequenceIfRequired 会导致 java.lang.NumberFormatException
预先感谢您投入时间来提供帮助。
上下文:
- 我正在使用 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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
IDENTITY关键字自动生成一个递增的64位长整数作为表的id。
您不必传递 id 属性,它将自动生成。
或者从脚本中删除 IDENTITY 关键字。
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.