当JPA试图持久化实体时,DB2-express抛出似乎不可能的错误:
ReportingSQLException: "ITEMID" is not valid in the context where it is used..
INSERT INTO NULLID."DynamicDatabaseTable" ("colname", "rownumber", "value")
VALUES (?, ?, ?) [params=?, ?, ?]
由于上面的查询中未使用ITEMID,因此该错误如何? ITEMID是自动生成标识的列。
我已经尝试手动执行查询,它运行正常,所以任何人都知道这是什么?即使经过大量的谷歌搜索,我也完全无能为力。
DB2中的数据库表很好,我有三重检查:
"itemid" BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY ( START WITH 1...),
"rownumber" BIGINT NOT NULL,
"colname" CHAR(30 OCTETS) NOT NULL,
"value" VARCHAR(254 OCTETS)
我使用Eclipse向导创建了一个简单的java“JPA Entity from a table”,我已经三次检查该类是否正常。
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="\"itemid\"", unique=true, nullable=false)
private long itemid;
@Column(name="\"rownumber\"", nullable=false)
private long rownumber;
@Column(name="\"colname\"", nullable=false, length=30)
private String colname;
@Column(name="\"value\"", length=254)
private String value;
为了以防万一,我还重新启动了整台计算机,但没有...我正在使用最新版本,几周前已安装干净。
答案 0 :(得分:2)
"itemid"
不等于itemid
- 如果没有用双引号括起来,SQL标识符默认转换为大写 。根据您的DDL,您创建了具有小写列名称的表。显然,JPA没有正确处理,并且生成的代码中的某处使用了不带引号的itemid
,它被转换为大写,并且毫不奇怪,在表中找不到该列。
没有理由在SQL中使用区分大小写的标识符,因此我建议您不要这样做以避免这些问题。