我正在使用 spring,它是用于数据库连接的 JdbcTemplate,我正在尝试为我的主键列自动生成一个键。我也在使用 HSQLDB。该表如下所示:
CREATE TABLE IF NOT EXISTS Customers (
cid BIGINT GENERATED BY DEFAULT AS PRIMARY KEY,
name VARCHAR(255) NOT NULL,
...
);
我的 Dao 对象中的代码如下所示:
Map<String, Object> values = new HashMap<String, Object>();
values.put("name", customer.getName());
// NOT putting the cid
...
SimpleJdbcInsert insert = new SimpleJdbcInsert(jdbc).withTableName(
"CUSTOMERS").usingGeneratedKeyColumns("CID");
Long key = (Long) insert.executeAndReturnKey(values);
如您所见,我没有手动输入 key ,我希望 usingGeneeratedKeyColumns
方法会自动为我生成它。无论如何,我在执行 executeAndReturnKey
后收到此错误:
org.springframework.dao.DataIntegrityViolationException:PreparedStatementCallback; SQL[];完整性约束违规:NOT NULL 检查约束; SYS_PK_10094 表:CUSTOMERS 列:CID;嵌套异常是 java.sql.SQLIntegrityConstraintViolationException:完整性约束违规:NOT NULL 检查约束; SYS_PK_10094 表:CUSTOMERS 列:CID
最佳答案
问题是从 HSQLDB
自动生成键的语法略有不同。您需要将其定义为 IDENTITY
,然后定义为 PRIMARY KEY
:
CREATE TABLE IF NOT EXISTS Customers (
cid BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
name VARCHAR(255) NOT NULL,
...
);
关于java - JdbcTemplate如何自动生成主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23804973/