oracle必须用sequence+@sequencegenerator实现自增,禁用identity;sequencename须与数据库序列名一致(大小写敏感),allocationsize必须设为1,实体id类型推荐long。

Oracle 本身不支持 AUTO_INCREMENT,必须用序列(SEQUENCE)+ JPA 显式配置才能实现“自增效果”。光写 @GeneratedValue(strategy = GenerationType.IDENTITY) 在 Oracle 上会直接报错或生成错误 ID。
Oracle 必须配 SEQUENCE + @SequenceGenerator
Oracle 没有原生自增列,JPA 的 IDENTITY 策略依赖数据库插入后返回生成值(如 MySQL 的 LAST_INSERT_ID()),而 Oracle 不提供该机制。所以必须显式绑定数据库序列:
-
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "mseq")中的generator值必须与@SequenceGenerator的name完全一致 -
@SequenceGenerator(sequenceName = "seq_newsId")的sequenceName必须是 Oracle 中已创建的真实序列名(大小写敏感,通常大写) -
allocationSize强烈建议设为1:Hibernate 默认用50,会导致序列跳号(比如你只插 3 条,序列却已走到 150) - 实体字段类型推荐用
Long,避免Integer溢出或与 OracleNUMBER(22)精度不匹配
建序列 SQL 和常见错误现象
序列没建好,或名字不一致,启动时就会抛 ORA-02289: sequence does not exist;插入时若序列权限不足,则报 ORA-00942: table or view does not exist(其实是序列访问被拒)。
- 建序列标准写法:
CREATE SEQUENCE seq_newsId INCREMENT BY 1 START WITH 1 MAXVALUE 999999999 NOCACHE;(加NOCACHE避免重启后跳号) - 确认序列存在:
SELECT sequence_name FROM user_sequences WHERE sequence_name = 'SEQ_NEWSID';(注意 Oracle 默认转大写) - 授予应用用户查询权限:
GRANT SELECT ON seq_newsId TO your_app_user; - 别用
START WITH 0:Oracle 序列从 0 开始可能触发 Hibernate 获取值时的空指针(尤其搭配allocationSize=1)
@GeneratedValue(strategy = GenerationType.AUTO) 在 Oracle 上不可靠
AUTO 策略在 Hibernate 6+ 中默认退化为 SEQUENCE,但会尝试使用名为 hibernate_sequence 的通用序列——如果你没手动建它,就会报错;即使建了,也违背业务意图(比如你想要 seq_newsId,而不是全局共用一个序列)。
- 显式写
GenerationType.SEQUENCE比AUTO更可控、更易排查 - 不要依赖 Hibernate 自动建序列:Spring Boot
spring.jpa.hibernate.ddl-auto=create不会创建 Oracle 序列,只管表结构 - 测试时务必验证首次插入:如果 ID 返回
50或100,大概率是allocationSize没设成1
不想用触发器?那就别碰 IDENTITY
Oracle 12c+ 虽然支持 GENERATED ALWAYS AS IDENTITY 列,但 JPA 的 IDENTITY 策略仍无法正确读取其生成值(Hibernate 无法解析 RETURNING INTO 的结果)。强行用会得到 0 或 null,甚至事务回滚失败。
- 真要用
IDENTITY列,必须配合自定义IdentifierGenerator或原生 SQL 插入,失去 JPA 简洁性 - 现有项目迁移到
IDENTITY列时,@SequenceGenerator注解必须彻底删除,否则 Hibernate 会优先走序列逻辑 - 混合使用(部分表用序列、部分用 identity)极易引发主键冲突,不建议
最稳的路径就一条:Oracle 侧建好带权限的序列,Java 侧用 @SequenceGenerator 绑定,且 allocationSize=1 —— 其他任何“省事”方案,上线后都会在批量插入或高并发场景下露出马脚。











