DB2 + JPA抛出错误:表中找不到列

时间:2015-03-20 17:45:52

标签: db2 jpa-2.0

当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;

为了以防万一,我还重新启动了整台计算机,但没有...我正在使用最新版本,几周前已安装干净。

1 个答案:

答案 0 :(得分:2)

"itemid"不等于itemid - 如果没有用双引号括起来,SQL标识符默认转换为大写 。根据您的DDL,您创建了具有小写列名称的表。显然,JPA没有正确处理,并且生成的代码中的某处使用了不带引号的itemid,它被转换为大写,并且毫不奇怪,在表中找不到该列。

没有理由在SQL中使用区分大小写的标识符,因此我建议您不要这样做以避免这些问题。