java - JdbcTemplate如何自动生成主键

标签 java sql spring hsqldb jdbctemplate

我正在使用 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/

相关文章:

java - 我的鼠标处理程序类导致鼠标移动和结果之间呈几何级数,我正在寻找原因

SQL Access 2010 - 三个表上的完全外连接

sql - 将数字字段中带逗号的数据导入 redshift

sql - 如何以通用方式处理来自 XML 输入的 SQL DateTime 转换

java - 如何在 maven Postman-plugin 中启用 STARTLS

Java Swing 'game loop' 最佳实践

java - 无法使用注释在 Spring IOC 中创建请求范围 bean

spring - @SpringBootTest 和 @Transactional 导致测试卡住

java - FAILURE 构建失败并出现异常

java - Spring Cloud Discovery First根本不起作用