IdType.AUTO在Oracle上失效,因Oracle无原生自增机制,需三处同步配置:实体类用@TableId(type = IdType.INPUT)和@KeySequence指定序列,Spring容器注册OracleKeyGenerator Bean,否则会报“无效的列类型:1111”或主键为null。

Oracle 不支持 AUTO_INCREMENT,MyBatis-Plus 默认的 IdType.AUTO 在 Oracle 上直接失效,必须显式对接数据库序列(SEQUENCE)——否则插入会报错“无效的列类型:1111”或主键为 null。
为什么 IdType.AUTO 在 Oracle 上不工作
Oracle 本身没有自增列语法(12c+ 的 IDENTITY 是特例,但 MyBatis-Plus 3.x 默认不识别该特性)。IdType.AUTO 底层依赖 JDBC 的 getGeneratedKeys(),而 Oracle 驱动对非 RETURNING 语句不支持该机制。你看到的“主键没回填”“ID 仍是 null”“插入失败”,根源都在这里。
- MySQL/PostgreSQL 等能用
AUTO,是因为它们原生支持自增 + JDBC 标准回填 - Oracle 必须走序列 +
RETURNING或显式SELECT seq.nextval FROM dual,MP 需要额外适配 - 若强行用
AUTO,MP 会传null给 ID 字段 → Oracle 驱动尝试用JdbcType.OTHER(类型码 1111)绑定 → 报错“无效的列类型:1111”
三处必须同步配置:实体、配置类、全局设置
缺一不可,漏掉任一环都会导致序列不触发或 ID 未回填。
- 实体类上加
@KeySequence(value = "SEQ_USER", clazz = Long.class),其中SEQ_USER必须与数据库中创建的序列名**完全一致(大小写敏感)** -
@TableId(type = IdType.INPUT)—— 注意不是AUTO,也不是NONE;INPUT表示“由 MP 调用序列生成器填值”,MP 才会去查@KeySequence - Spring 容器中必须注册
OracleKeyGeneratorBean:@Bean public OracleKeyGenerator oracleKeyGenerator() { return new OracleKeyGenerator(); } - 全局配置(
application.yml)里不要覆盖id-type为AUTO或其他值,保持默认或显式设为input(仅限 MP 2.x);MP 3.4+ 推荐靠注解驱动,避免全局污染
常见报错及对应修复点
遇到错误先对照这几点快速定位:
-
java.sql.SQLException: 无效的列类型: 1111→ 缺少mybatis-plus.configuration.jdbc-type-for-null: 'null'配置(注意单引号!),且 MP 版本 ≥ 3.4.0 - 插入成功但
user.getId()仍是null→ 检查是否漏了@KeySequence,或clazz类型与字段类型不匹配(如字段是Long却写clazz = Integer.class) -
ORA-02289: sequence does not exist→ 数据库里序列名拼错,或用户权限不足(需SELECT权限) - 批量插入(
insertBatch)ID 全一样 →OracleKeyGenerator默认非线程安全,高并发下需改用自定义生成器或 Redis 分布式 ID
Oracle 12c+ 可用 IDENTITY,但 MP 不自动识别
虽然 Oracle 12c 支持 id NUMBER GENERATED BY DEFAULT AS IDENTITY,但 MyBatis-Plus 当前(截至 2026 年)仍不会自动启用 RETURNING 子句去获取该值。你依然得走序列老路,或手动在 SQL 中写 INSERT ... RETURNING id INTO ? 并配合 use-generated-keys: true。
这意味着:哪怕用了 IDENTITY,不配 @KeySequence + OracleKeyGenerator,MP 还是不知道怎么取 ID —— 它不会主动探测表结构是否启用了 identity。


















