Hibernate 5 不会自动创建 Oracle 19c 的 SEQUENCE,必须手动执行 CREATE SEQUENCE;@SequenceGenerator 仅绑定已有序列,allocationSize=1 需显式设置以防跳号,否则首次插入即报 ORA-02289 或 ORA-00942。

Hibernate 5 不会、也不能在 Oracle 19c 中自动创建 SEQUENCE 对象 —— 它只负责用,不负责建。
为什么 hibernate_sequence 没出现?
Hibernate 启动时不会主动执行 CREATE SEQUENCE,哪怕你配置了 spring.jpa.hibernate.ddl-auto=update 或 create。原因很直接:
- Oracle 方言(
OracleDialect)不支持序列的 DDL 导出,@SequenceGenerator或<generator class="sequence">只告诉 Hibernate “去哪取值”,不触发建序列逻辑 -
hibernate.hbm2ddl.auto在 Oracle 下仅对比表结构(CREATE TABLE)、约束(PK/FK),从不扫描或生成序列 - 如果其他 schema 已存在同名序列(比如 DBA 创建过
hibernate_sequence),Hibernate 会误判“已存在”,但当前用户无权限访问,导致后续SELECT hibernate_sequence.NEXTVAL FROM DUAL报ORA-00942
@SequenceGenerator 的 sequenceName 必须真实存在
这个注解不是声明式定义,而是运行时绑定。Hibernate 会在插入前发出类似这样的 SQL:
SELECT your_seq_name.NEXTVAL FROM DUAL
所以:
-
sequenceName = "USER_ID_SEQ"→ 你必须提前在 Oracle 中执行CREATE SEQUENCE USER_ID_SEQ INCREMENT BY 1 START WITH 1 -
allocationSize = 1必须显式设置,否则默认为 50,会导致序列跳号(如插 1 条,实际NEXTVAL调用了 50 次) - 若用
GenerationType.IDENTITY,Oracle 19c 要求表字段定义为GENERATED BY DEFAULT AS IDENTITY,且 Hibernate 5.4+ 才完整支持;低版本会直接忽略或报错
常见错误现象与绕过方式
典型报错包括:
-
ORA-02289: sequence does not exist→ 缺少手动建序列 -
ORA-00942: table or view does not exist→ 当前用户无权访问目标序列(注意不是表) -
ORA-01400: cannot insert NULL into ("SCHEMA"."TABLE"."ID")→ 序列没被调用,主键字段传了null
绕过方案只有两个可靠路径:
- 运维侧:用 Flyway/Liquibase 提前执行
V1__create_sequences.sql,内容为CREATE SEQUENCE ... - 开发侧:改用
GenerationType.UUID(无依赖)或GenerationType.TABLE(需额外维护表),但都牺牲了 Oracle 原生序列的性能和可预测性
最易被忽略的一点:Hibernate 5 对 Oracle 的适配是「被动使用」而非「主动管理」。你写的每个 @SequenceGenerator 都像一张欠条,数据库里没对应序列,它就真不还钱 —— 不报编译错,只在第一次 INSERT 时崩给你看。


















